检索subprocess.call()的输出

问题:

如何使用subprocess.call()获取进程的输出?
将StringIO.StringIO对象传递给stdout会导致此错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/subprocess.py", line 444, in call
    return Popen(*popenargs, **kwargs).wait()
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/subprocess.py", line 588, in __init__
    errread, errwrite) = self._get_handles(stdin, stdout, stderr)
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/subprocess.py", line 945, in _get_handles
    c2pwrite = stdout.fileno()
AttributeError: StringIO instance has no attribute 'fileno'
>>> 

回答:

subprocess.call()的输出只能重定向到文件。
您应该使用subprocess.Popen()。然后,您可以通过subprocess.PIPE获取stderr,stdout和/或stdin参数,并使用communicate()方法从管道读取:

from subprocess import Popen, PIPE

p = Popen(['program', 'arg1'], stdin=PIPE, stdout=PIPE, stderr=PIPE)
output, err = p.communicate(b"input data that is passed to subprocess' stdin")
rc = p.returncode

推理是由subprocess.call()使用的类文件对象必须有一个真实的文件描述符,从而实现fileno()方法。只要使用任何类似文件的对象就不会这样做了。
有关详细信息,请参阅here

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Retrieving the output of subprocess.call()

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

87 − = 77