【发布时间】:2011-01-01 01:50:50
【问题描述】:
如何获取使用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'
>>>
【问题讨论】:
-
迈克的回答是正确的。请注意,
StringIO在大多数情况下 像文件一样工作,但不是全部。它不适用于您的情况,因为multiprocessing模块在某些情况下假定实际文件。这可能已修复:请参阅 bugs.python.org/issue5313 了解相关错误。 -
其实
communicate()使用select.select(),它只接受文件描述符,所以它不是一个真正的错误。当我第一次遇到它时,我对此感到很困惑,探索 subprocess.py 的深度教会了我很多东西!。 -
我认为
subprocess.run使这更简单,从 Python 3.5 开始。有机会我会补充答案的。 -
请注意,接受的答案已经过时了。 Python 2.7 的简单答案是
subprocess.check_output();在 Python 3.5+ 中,您还需要查看subprocess.run()。如果可以避免的话,应该没有必要或不想使用原始subprocess.Popen(),尽管一些更复杂的用例需要它(然后你必须自己做必要的管道)。 Stack Overflowsubprocesstag info page 为不那么琐碎的案例提供了一些很好的资源。
标签: python pipe subprocess stringio