2017-01-27 12 views
0

Настройка следующая: Я работаю с инструментами Kaldi. Они вызываются в сценариях bash определенной формы. Эти сценарии bash вызывается программой-оболочкой, написанной на python, которая отправляет задачи в Sun Grid Engine.Python and Kaldi: Ошибка поврежденной трубы

Команда, которую я хочу, чтобы выполнить это следующий

feat-to-dim 'ark:copy-feats scp:train.scp ark:- |' - 

Выполнение этого в командной строке, дает правильный результат «40» вместе с предупреждением

WARNING (feat-to-dim[5.0.23-f7b2f]:Close():kaldi-io.cc:501) Pipe copy-feats scp:train.scp ark:- | had nonzero return status 13 

Однако, если я оберните это следующим образом:

python -c "import os; os.system(\"feat-to-dim 'ark:copy-feats scp:train.scp ark:- |' -\")" 

Программа copy-feats fa илы с ошибкой:

ERROR (copy-feats[5.0.23-f7b2f]:Write():kaldi-matrix.cc:1240) Failed to write matrix to stream 

После различных трассировки стека и следующих ошибок, следующее предупреждение печатается дополнительно:

WARNING (feat-to-dim[5.0.23-f7b2f]:Close():kaldi-io.cc:501) Pipe copy-feats scp:train.scp ark:- | had nonzero return status 134 

Это то, что я узнал: feat-to-dim закрывает трубу заранее, тогда как copy-feats пытается продолжить запись вывода. Поскольку это невозможно, copy-feats завершается. 13, вероятно, указывает на ошибку обрыва трубы.

Для Python это серьезная проблема, почему она превращает ее в ошибку и завершается. Но в этом случае это не Python, который дает эту ошибку, но copy-feats. Поэтому материал вроде try/catch в python или trapping the pipe, похоже, не имеет успеха в этом случае.

Кроме того, следующие строки работают прекрасно без каких-либо предупреждений или ошибок:

python -c "import os; os.system(\"copy-feats scp:train.scp ark:-\")" > cp 
python -c "import os; os.system(\"feat-to-dim ark:cp -\")" 

и следующая строка дает простое сообщение об ошибке cat: write error: Broken pipe и состояние выхода 256:

python -c "import os; os.system(\"feat-to-dim ark:'cat cp |' -\")" 

У Вас есть любые дальнейшие предложения здесь?

ответ

0

13 probably indicates the broken pipe error.

13 является ответом (функция измерения), вы можете использовать его в качестве результата, вы можете игнорировать все другие ошибки, как этот

with open(os.devnull, "w") as devnull: 
    subprocess.call("feat-to-dim 'ark:copy-feats scp:feats.scp ark:- |' -", shell=True, stderr=devnull) 

This is what I've found out: feat-to-dim closes the pipe in advance whereas copy-feats tries to continue writing output.

Это дизайн Kaldi, он пытается чтобы читать только первую функцию и просто сбрасывать остальное, но так как труба не имеет никакого значения, чтобы прекратить запись писателя, она должна выйти с таким плохим образом. Опция состоит в том, чтобы читать полный выходной файл в режиме «умение», но это будет медленнее.

Возможно, вы можете открыть ошибку Kaldi об этом.

+0

На самом деле, 13 является статусом возврата «feat-to-dim» ark: copy-feats scp: train.scp ark: - | ' -' выполняется в командной строке. Ответ (размер функции) должен быть 40. Спасибо за ваше предложение. Он работает, но его сложно интегрировать в мою настройку, потому что игнорирование всех ошибок по умолчанию - это не то, что я хочу. Можно ли как-то поймать эту сломанную трубную ошибку? - было бы лучше, если бы я мог справиться с этим в коде bash. – Green

+0

Нет, 13 - особенность. Вы можете использовать add-deltas вместо copy-feats, а затем увидите 39. –

+0

Использование 'add-deltas' вместо' copy-feats' дает 120 и возвращает статус 13 снова. – Green

 Смежные вопросы

  • Нет связанных вопросов^_^