0

我正在尝试运行一个外部程序(在这种情况下只是 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'

附言。一旦这个工作我也想捕获标准输出,但我想那是一样的。ps2。我在 Windows 和 Python 2.7.3 上尝试了上述方法

4

2 回答 2

2

你需要设置stderr = subprocess.PIPE

例如:

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

请注意,要使其正常工作,您需要访问该Popen对象,因此您不能subprocess.call在这里真正使用(您确实需要subprocess.Popen)。

于 2013-01-14T16:33:47.490 回答
0

使用 subprocess.check_output。从文档

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.
于 2013-01-15T18:24:50.780 回答