我在尝试轮询urllib2.urlopen()返回的类文件对象时遇到了http://bugs.python.org/issue1327971中描述的错误。
不幸的是,对于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'
更新:我不想修改系统库。
答案 0 :(得分:1)
如果您不想修改系统库,您还可以动态修补httplib
以匹配错误报告中的补丁:
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
是原始文件描述符值,而不是类文件对象。您可能需要使用原始文件对象来读取数据,而不是poll返回的值。
答案 1 :(得分:0)
您似乎想要使用this patch修改urllib。请记住,这个代码尚未发布是有原因的。它尚未完全审核。
编辑:实际上,我认为你想用the other patch修改httplib。