2011-08-09 8 views
5

Estoy tratando de hacer una descarga asíncrona de archivos usando urllib2 pero no he tenido éxito en encontrar el socket (o su fileno) para esperar nuevos datos para solicitudes HTTP. Esto es lo que ya he intentado.Obtener socket para el valor de retorno urllib2.urlopen para 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' 
>>> 

Respuesta

2

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

El problema es que urlib2 se cambió para envolver un objeto HTTPResponse en un socket._fileobject para conseguir un poco más de los métodos de archivo. Excepto (como se informó anteriormente) HTTPResponse no tiene un método fileno(), por lo que cuando _fileobject intenta usarlo, explota.

La solución

Adición de un método apropiado para HTTPResponse:

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

O, alternativamente, utilizar urllib.urlopen en lugar de urrlib2.urlopen.

Hay un bug report para este problema; fue arreglado en Python 3 y en Python 2.7.

+0

¡Gracias, señor! –

+0

Se debe generar un error, si no hay uno ya. –

+0

http://bugs.python.org/issue1327971. De hecho, parece que eres el que cometió la solución para esto? – agf

Cuestiones relacionadas