2012-03-05 19 views
2

私はプロセスを実行しようとしています。終了したらstderrとstdoutを読んでください。私は、Pythonでこれを行うための唯一の方法は、subprocess.Popenを作成し、stderrとstdout argsとしてsubprocess.PIPEを使用して、Popen.stderrとPopen.stdoutファイル記述子を読み取ることです。Python subprocess.Popen strange behavior

In [133]: subprocess.call(['python', '-c', "import sys; sys.exit(1)"]) 
Out[133]: 1 

In [134]: p = subprocess.Popen(['python', '-c', "import sys; sys.exit(1)"]) 

In [135]: p.returncode 

In [136]: 

私はsubprocess.callのリターンコードを取得することができますが、私はsubprocess.Popenのリターンコードを取得することはできません。また、私はsubprocess.Popenが実際にコマンドを実行しますかどうかを確認するために標準エラー出力を読んで試してみた:

In [143]: p = subprocess.Popen(['python', '-c', "import sys; sys.stderr.write('ook'); sys.exit(1)"], stderr=subprocess.PIPE) 

In [144]: p.stderr.read() 
Out[144]: 'ook' 

In [145]: p.returncode 

In [146]: p.kill() 

In [147]: p.returncode 

In [148]: 

だから、私はsubprocess.Popenに与えるコマンドが実行されていることを意味する、標準エラー出力を読み取ることができますが、私はリターンコードを取得することはできませんsubprocess.Popen。何か案は?

答えて

4

コマンドを完了するには、waitが必要です。

>>> p.wait() 
1 
>>> p.returncode 
1 

または使用communicate

>>> stdout, stderr = p.communicate() 
>>> stdout 
>>> stderr 
'ook' 
>>> p.returncode 
1 
0
if (subprocess.call(command, shell=True) != 0): 
    # wait and return returncode attribute 
    # non-zero returncode indicates failure 
    pass 
2

これを試してみてください。

In [39]: p = subprocess.Popen(['python', '-c', "import sys; sys.exit(1)"]) 

In [40]: p.poll() 
Out[40]: 1