2017-05-24 23 views
0

私はPythonで文字列としてbashコマンドの標準出力を取得しようとしています。 Popenドキュメンテーションに続いて、私が試してみた:このスクリプトを実行サブプロセスPopen.communicate()メソッドの使用方法は?

import subprocess 

p = subprocess.Popen(["echo", "hello"]) 
stdoutdata, stderrdata = p.communicate() 

print stdoutdata 

は、次のような出力が得られます。

hello 
None 
[Finished in 0.0s] 

出力は、Pythonで印刷きているもののので、stdoutdata変数がNoneではなく、"hello"私が望むように。どうすればいいですか?

答えて

2

Popenコンストラクタに標準出力を提供していない場合、デフォルトの機能は単に出力を親のstdoutハンドルに書き込むだけです。したがって、あなたはそれがあなたのシェルに印刷されているのを見ています。 Popen's docsから引用

Noneのデフォルト設定では

、リダイレクトは起こりません。子のファイルハンドルは親から継承されます。


STDOUTとしてタプル使用subprocess.PIPEを得にSTDOUTを移入します。

docsからの引用:

結果タプルのNone以外のものを取得するには、あまりにも stdout=PIPEおよび/またはstderr=PIPEを与える必要があります。

>>> import subprocess 
>>> p = subprocess.Popen(["echo", "hello"], stdout=subprocess.PIPE) 
>>> p.communicate() 
('hello\n', None) 
0

subprocess.check_output方法は、私は必要なものであるように思え:私が期待するよう

import subprocess 
output = subprocess.check_output(["echo", "hello"]) 

outputは今(改行文字を含む)'hello\n'です。

0

あなたはPopenコンストラクタにstdoutstderrフラグを渡す必要があります。
デフォルトではNoneに設定されており、その結果、Popenがキャプチャしていません。

cmd = subprocess.Popen(["echo", "hello"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
out, err = cmd.communicate() 
# retCode = cmd.returncode 
# RetCode != 0, indicates an error occured in execution. 
print (out) 
>>> b'hello\n' 
関連する問題