問題は、ほぼ確実に、コマンドが stderr と stdout に書き込みを行っており、stdout のみをキャプチャしていることです。
2 つを 1 つの文字列にマージする場合は、次のようにします。
x = subprocess.Popen(["nosetests",
"TestStateMachine.py:FluidityTest.test_it_has_an_initial_state",
"-v"],
stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
out_and_err, _ = x.communicate()
それらを別々の文字列として取得したい場合:
x = subprocess.Popen(["nosetests",
"TestStateMachine.py:FluidityTest.test_it_has_an_initial_state",
"-v"],
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = x.communicate()
これは、よく使用される引数で説明されています。
stdin、stdout、およびstderrは、実行されたプログラムの標準入力、標準出力、および標準エラー ファイル ハンドルをそれぞれ指定します。有効な値は次のとおりです。 さらに、stderrを にすることができます。これは、子プロセスからの stderr データをstdoutSTDOUT
と同じファイル ハンドルにキャプチャする必要があることを示します。
ただし、標準エラーについて聞いたことがない場合は、これを探しに行かないことは理解できます... ドキュメントは、プログラムごとに個別の出力とエラーパイプの基本的な C/POSIX モデルを知っていることを前提としています。
補足として、プログラムを実行してその出力を取得し、その stderr を stdout とマージすることだけを実行したい場合は、 を作成してそれPopen
を呼び出す必要はありませんcommunicate
。ちょうど使用check_output
:
out_and_err = subprocess.check_output([… args …], stderr=subprocess.STDOUT)