对由urllib2.urlopen()返回的类文件对象使用poll?
问题描述:
我试图轮询urllib2.urlopen()返回的类文件对象时遇到http://bugs.python.org/issue1327971中描述的错误。对由urllib2.urlopen()返回的类文件对象使用poll?
不幸的是,对于Python相对来说比较陌生,我实际上无法从响应中确定如何解决这个问题,因为他们似乎主要致力于修复该错误,而不是篡改触发其工作的代码。
这里是我的代码蒸馏版本引发错误:
import urllib2, select
if __name__ == "__main__":
p = select.poll()
url = "http://localhost/"
fd = urllib2.urlopen(url)
p.register(fd, select.POLLIN | select.POLLERR | select.POLLHUP | select.POLLNVAL)
result = p.poll()
for fd, event in result:
if event == select.POLLIN:
while 1:
buf = fd.read(4096)
if not buf:
break
print buf
当我在Python 2.6中运行它,它引发的错误:
Traceback (most recent call last):
File "/home/shab/py/test.py", line 9, in <module>
p.register(fd, select.POLLIN | select.POLLERR | select.POLLHUP | select.POLLNVAL)
File "/usr/lib/python2.6/socket.py", line 287, in fileno
return self._sock.fileno()
AttributeError: HTTPResponse instance has no attribute 'fileno'
更新:我不知道想修改系统库。
答
如果你不想也修改你的系统库,你可以在飞行补丁httplib
在bug报告补丁匹配:
import httplib
@property
def http_fileno(self):
return self.fp.fileno
@http_fileno.setter
def http_fileno(self, value):
self.fp.fileno = value
httplib.HTTPResponse.fileno = http_fileno
# and now on with the previous code
# ...
然后您上fd.read(4096)
得到一个错误,因为fd
返回通过poll
是一个原始文件描述符值,而不是文件类对象。您可能需要使用原始文件对象来读取数据,而不是轮询返回的值。