检索subprocess.call()的输出 [英] Retrieving the output of subprocess.call()

查看:662
本文介绍了检索subprocess.call()的输出的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何获取使用subprocess.call()运行的进程的输出?

How can I get the output of a process run using subprocess.call()?

StringIO.StringIO对象传递给stdout会出现此错误:

Passing a StringIO.StringIO object to stdout gives this error:

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()的输出仅应重定向到文件.

Output from subprocess.call() should only be redirected to files.

您应该改用subprocess.Popen().然后,您可以将subprocess.PIPE作为stderr,stdout和/或stdin参数传递,并使用communicate()方法从管道读取:

You should use subprocess.Popen() instead. Then you can pass subprocess.PIPE for the stderr, stdout, and/or stdin parameters and read from the pipes by using the communicate() method:

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()方法.仅使用任何类似文件的对象都无法解决问题.

The reasoning is that the file-like object used by subprocess.call() must have a real file descriptor, and thus implement the fileno() method. Just using any file-like object won't do the trick.

有关更多信息,请参见此处.

See here for more info.

这篇关于检索subprocess.call()的输出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆