查看: 14778|回复: 2

AttributeError: StringIO instance has no attribute 'fileno'

[复制链接]

10

主题

82

帖子

200

积分

中级会员

Rank: 3Rank: 3

积分
200
发表于 2018-9-19 14:52:01 | 显示全部楼层 |阅读模式
如何使用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'
>>>
回复

使用道具 举报

9

主题

74

帖子

185

积分

注册会员

Rank: 2

积分
185
发表于 2018-9-19 14:56:35 | 显示全部楼层
subprocess.call()只应将输出重定向到文件。
你应该使用subprocess.Popen()。然后,您可以传递subprocess.PIPEstderr,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()方法。只使用任何类似文件的对象都无法解决问题。
有关详细信息,请参见此处
回复

使用道具 举报

11

主题

63

帖子

159

积分

注册会员

Rank: 2

积分
159
发表于 2018-9-19 14:57:50 | 显示全部楼层
如果你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
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表