在urllib2.urlopen()返回的类文件对象上使用poll?

时间:2009-05-27 04:22:12

标签: python python-2.6

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

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

2 个答案:

答案 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。