2017-01-27 16 views
0

セットアップは次のとおりです:私はKaldiツールを使って作業しています。それらはある形式のbashスクリプトで呼び出されます。これらのbashスクリプトは、タスクをSun Grid Engineに送信するPythonで記述されたラッパープログラムによって呼び出されます。PythonとKaldi:壊れたパイプエラー

私は実行するコマンドは、次のよう

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

は、コマンドラインでこれを実行している私が包む場合、

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 

しかし警告と一緒に正しい結果「40」を生み出しますこれは次のようになります。

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

プログラムcopy-feats faエラーとILS:様々なスタックトレースと、次のエラーの後

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、または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バグを開くことができます。

+0

実際には、13は 'feat-to-dim '箱の戻り状態です:copy-feats scp:train.scp ark: - |'コマンドラインで実行されます。答え(フィーチャディメンション)は40にする必要があります。ありがとうございます。それは動作しますが、デフォルトですべてのエラーを無視することは私が望むものではないので、セットアップに統合するのは難しいです。何とかこの壊れたパイプエラーをキャッチすることも可能ですか? - 私がbashコードでそれを処理できるのが最善でしょう。 – Green

+0

いいえ、13はフィーチャ次元です。 copy-featsの代わりにadd-deltasを使うと、39が表示されます。 –

+0

'copy-feats'の代わりに' add-deltas'を使うと、120と戻りステータス13が再び発生します。 – Green

関連する問題