0

我在尝试轮询 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'

更新:我不想修改系统库。

4

2 回答 2

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 返回的值。

于 2009-05-27T04:56:09.537 回答
0

看起来你想用这个补丁修改 urllib 。请记住,此代码尚未发布是有原因的。它还没有被完全审查。

编辑:实际上,我想你想用另一个补丁修改 httplib 。

于 2009-05-27T04:29:08.537 回答