我正在尝试运行一个进程,一旦完成,请阅读stderr和stdout。我发现使用Python的唯一方法就是创建一个subprocess.Popen,将subprocess.PIPE作为stderr和stdout args,然后读取Popen.stderr和Popen.stdout文件描述符。
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
的返回码。我也试过读stderr看看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]:
所以我可以读取stderr,这意味着我给subprocess.Popen的命令正在运行,但我无法获得subprocess.Popen
的返回码。有什么想法吗?
答案 0 :(得分:4)
您必须wait
才能完成命令。
>>> p.wait()
1
>>> p.returncode
1
或使用communicate
:
>>> stdout, stderr = p.communicate()
>>> stdout
>>> stderr
'ook'
>>> p.returncode
1
答案 1 :(得分:2)
试试这个:
In [39]: p = subprocess.Popen(['python', '-c', "import sys; sys.exit(1)"])
In [40]: p.poll()
Out[40]: 1
答案 2 :(得分:0)
if (subprocess.call(command, shell=True) != 0):
# wait and return returncode attribute
# non-zero returncode indicates failure
pass