2012-03-05 89 views
2

我试图运行一个进程,当它完成后,读取stderr和stdout。我发现只有这样做的方法是使用Python创建一个subprocess.Popen,并将subprocess.PIPE作为stderr和stdout参数,然后读取Popen.stderr和Popen.stdout文件描述符。Python子进程.Popen奇怪的行为

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