检索 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'
>>>

原文由 Jeffrey Aylesworth 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 908
2 个回答

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() 方法。仅仅使用任何类似文件的对象都不会成功。

请参阅 此处 了解更多信息。

原文由 Mike 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果您的 Python 版本 >= 2.7,则可以使用 subprocess.check_output 它基本上完全符合您的要求(它以字符串形式返回标准输出)。

简单示例(linux版本,见注释):

 import subprocess

print subprocess.check_output(["ping", "-c", "1", "8.8.8.8"])

请注意,ping 命令使用的是 linux 表示法( -c 用于计数)。如果您在 Windows 上尝试此操作,请记住将其更改为 -n 以获得相同的结果。

正如下面评论的那样,您可以在 这个其他答案 中找到更详细的解释。

原文由 sargue 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题