我正在尝试运行外部程序(在本例中只是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上尝试了上述内容
答案 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.