首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在urllib2.urlopen()返回的类似文件的对象上使用轮询?

在urllib2.urlopen()返回的类似文件的对象上使用轮询?
EN

Stack Overflow用户
提问于 2009-05-27 04:22:12
回答 2查看 1.2K关注 0票数 0

在尝试轮询由urllib2.urlopen()返回的类似文件的对象时,我遇到了http://bugs.python.org/issue1327971中描述的错误。

不幸的是,作为Python的新手,我实际上不能从回复中确定如何解决这个问题,因为它们似乎主要是为了修复bug,而不是攻击触发它工作的代码。

下面是我抛出错误的代码的一个提炼版本:

代码语言:javascript
运行
复制
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上运行它时引发的错误:

代码语言:javascript
运行
复制
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'

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-05-27 04:56:10

如果你不想修改你的系统库,你也可以动态地给httplib打补丁,以匹配错误报告中的补丁:

代码语言:javascript
运行
复制
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返回的值。

票数 1
EN

Stack Overflow用户

发布于 2009-05-27 04:29:09

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

编辑:实际上,我认为你想用the other patch修改httplib。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/913913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档