我如何获取使用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
模块在某些情况下假定实际的文件存在。这个问题可能已经被修复了:请参见http://bugs.python.org/issue5313以获取相关错误信息。 - Michael Greenecommunicate()
使用的是select.select()
,它只接受文件描述符,所以这并不是一个错误。当我第一次遇到它并深入探索 subprocess.py 时,我感到非常困惑,但也学到了很多! - Mikesubprocess.run
自Python 3.5版本起使得这个过程更简单了。我有机会时会添加一个答案。 - Mark Amerysubprocess.check_output()
;在 Python 3.5+ 中,您还需要查看subprocess.run()
。如果可以避免使用原始的subprocess.Popen()
,则不应该或不想使用它,尽管某些更复杂的用例需要它(然后您必须自己围绕它进行所需的管道工作)。Stack Overflowsubprocess
标签信息页面提供了一些适用于较不常见情况的良好资源。 - tripleee