正在检索subprocess.call()的输出

2020-12-04 15:24:30 发布

您现在位置:Python中文网/ 问答频道 /正文

如何使用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'
>>> 
3条回答
网友
1楼 ·

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

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

import subprocess

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

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

如下所述,您可以在this other answer中找到更详细的解释。

网友
2楼 ·

来自subprocess.call()的输出只应重定向到文件。

您应该改用subprocess.Popen()。然后可以为stderr、stdout和/或stdin参数传递subprocess.PIPE,并使用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

网友
3楼 ·

对于python 3.5+,建议使用run function from the subprocess module。这将返回一个CompletedProcess对象,您可以从中轻松获得输出和返回代码。

from subprocess import PIPE, run

command = ['echo', 'hello']
result = run(command, stdout=PIPE, stderr=PIPE, universal_newlines=True)
print(result.returncode, result.stdout, result.stderr)

相关问题