Настройка следующая: Я работаю с инструментами 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 |' -\")"
У Вас есть любые дальнейшие предложения здесь?
На самом деле, 13 является статусом возврата «feat-to-dim» ark: copy-feats scp: train.scp ark: - | ' -' выполняется в командной строке. Ответ (размер функции) должен быть 40. Спасибо за ваше предложение. Он работает, но его сложно интегрировать в мою настройку, потому что игнорирование всех ошибок по умолчанию - это не то, что я хочу. Можно ли как-то поймать эту сломанную трубную ошибку? - было бы лучше, если бы я мог справиться с этим в коде bash. – Green
Нет, 13 - особенность. Вы можете использовать add-deltas вместо copy-feats, а затем увидите 39. –
Использование 'add-deltas' вместо' copy-feats' дает 120 и возвращает статус 13 снова. – Green