如何在python中捕获外部进程的输出

时间:2013-01-14 16:32:53

标签: python stdout stderr

我正在尝试运行外部程序(在本例中只是python -V)并捕获内存中的标准错误。

如果我重定向到磁盘,它会起作用:

import sys, os
import subprocess
import tempfile
err = tempfile.mkstemp()
print err[1]
p = subprocess.call([sys.executable, '-V'], stderr=err[0] )

但这并不好玩。然后我需要将该文件读入内存。

我以为我可以在内存中创建一些类似于使用StringIO的文件,但这次尝试失败了:

import sys, os
import subprocess
import tempfile
import StringIO

err = StringIO.StringIO()
p = subprocess.call([sys.executable, '-V'], stderr=err )

我得到了:

AttributeError: StringIO instance has no attribute 'fileno'

PS。一旦这个工作,我也想捕获标准输出,但我想这是相同的。 PS2。我在Windows和Python 2.7.3上尝试了上述内容

2 个答案:

答案 0 :(得分:2)

您需要设置stderr = subprocess.PIPE

e.g:

p = subprocess.Popen(...,stderr = subprocess.PIPE)
stdout,stderr = p.communicate()
#p.stderr.read() could work too.

note ,要使其正常工作,您需要访问Popen对象,因此您无法真正使用subprocess.call(您确实需要subprocess.Popen })。

答案 1 :(得分:0)

使用subprocess.check_output。来自docs

subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False)
Run command with arguments and return its output as a byte string.