2009-05-27 36 views
0

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

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

回答

1

如果你不想也修改你的系统库,你可以在飞行补丁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是一个原始文件描述符值,而不是文件类对象。您可能需要使用原始文件对象来读取数据,而不是轮询返回的值。

0

它看起来像你想用this patch修改urllib。请记住,这个代码还没有被释放。它尚未完全审查。

编辑:其实,我想你想修改httplib与the other patch