Получить сокет для urllib2.urlopen возвращаемое значение для HTTP - PullRequest
5 голосов
/ 09 августа 2011

Я пытаюсь выполнить асинхронную загрузку файлов, используя urllib2, но мне не удалось найти сокет (или его fileno), чтобы дождаться новых данных для HTTP-запросов. Вот что я уже пробовал.

>>> from urllib2 import urlopen
>>> from select import select
>>> r = urlopen('http://stackoverflow.com/')
>>> select([r], [], [])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/socket.py", line 307, in fileno
    return self._sock.fileno()
AttributeError: HTTPResponse instance has no attribute 'fileno'
>>> r.fileno()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/socket.py", line 307, in fileno
    return self._sock.fileno()
AttributeError: HTTPResponse instance has no attribute 'fileno'
>>> r.fp.fileno()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/socket.py", line 307, in fileno
    return self._sock.fileno()
AttributeError: HTTPResponse instance has no attribute 'fileno'
>>> select([r.fp], [], [])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/socket.py", line 307, in fileno
    return self._sock.fileno()
AttributeError: HTTPResponse instance has no attribute 'fileno'
>>> 

1 Ответ

2 голосов
/ 09 августа 2011

См. http://www.velocityreviews.com/forums/t512553-re-urllib2-urlopen-broken.html.

Проблема в том, что urlib2 был изменен для переноса объекта HTTPResponse в объекте socket._fileobject, чтобы получить еще несколько файловых методов. Кроме как сообщалось выше) HTTPResponse не имеет метода fileno (), поэтому, когда _fileobject пытается использовать его, он взрывается.

Решение

Добавление подходящего метода в HTTPResponse:

def fileno(self):
    return self.fp.fileno()

Или, альтернативно, использовать urllib.urlopen вместо urrlib2.urlopen.

Для этой проблемы существует отчет об ошибке ; это было исправлено в Python 3 и в Python 2.7.

...