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

0 投票
2 回答
1277 浏览
提问于 2025-04-15 11:51

我在使用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

看起来你想用这个补丁来修改urllib。要记住,这段代码之所以没有发布,是因为它还没有经过全面的审核。

补充一下:其实,我觉得你想用另一个补丁来修改httplib。

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)这行代码上遇到错误,因为poll返回的fd是一个原始的文件描述符值,而不是一个像文件一样的对象。你可能需要用原始的文件对象来读取数据,而不是用poll返回的值。

撰写回答