2

私が好きなら:

x = subprocess.Popen(["nosetests",      
"TestStateMachine.py:FluidityTest.test_it_has_an_initial_state", "-v"], 
stdout=subprocess.PIPE)

コマンドの出力が実行されました。

test_it_has_an_initial_state (TestStateMachine.FluidityTest) ... ok

----------------------------------------------------------------------
Ran 1 test in 0.001s

OK

しかし、たとえばx.communicate()を呼び出すと、次のようになります。

('', None)

たとえば、そのメッセージを変数に保存するにはどうすればよいですか?

4

1 に答える 1

4

問題は、ほぼ確実に、コマンドが 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()

これは、よく使用される引数で説明されています。

stdinstdout、およびstderrは、実行されたプログラムの標準入力、標準出力、および標準エラー ファイル ハンドルをそれぞれ指定します。有効な値は次のとおりです。 さらに、stderrを にすることができます。これは、子プロセスからの stderr データをstdoutSTDOUTと同じファイル ハンドルにキャプチャする必要があることを示します。

ただし、標準エラーについて聞いたことがない場合は、これを探しに行かないことは理解できます... ドキュメントは、プログラムごとに個別の出力とエラーパイプの基本的な C/POSIX モデルを知っていることを前提としています。


補足として、プログラムを実行してその出力を取得し、その stderr を stdout とマージすることだけを実行したい場合は、 を作成してそれPopenを呼び出す必要はありませんcommunicate。ちょうど使用check_output

out_and_err = subprocess.check_output([… args …], stderr=subprocess.STDOUT)
于 2014-01-15T01:47:33.267 に答える