En utilisant sondage sur objet-fichier retourné par urllib2.urlopen ()?
-
06-09-2019 - |
Question
J'ai couru dans le bogue décrit http://bugs.python.org/issue1327971 tout en essayant de sondage un objet de type fichier retourné par urllib2.urlopen ().
Malheureusement, étant relativement nouveau pour Python, je ne peux pas déterminer en fait à partir des réponses à la façon de contourner le problème car ils semblent principalement orientés vers corriger le bug, plutôt que le piratage du code qui déclenche cela fonctionne.
Voici une version distillée de mon code qui jette l'erreur:
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
Et l'erreur qui est soulevée quand je le lance sur 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'
Mise à jour:. Je ne veux pas modifier les bibliothèques système
La solution
Si vous ne voulez pas modifier vous vous les bibliothèques système peut également patcher httplib
à la volée pour correspondre le patch dans le rapport de bogue:
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
# ...
Vous obtenez alors une erreur sur fd.read(4096)
parce que le fd
retourné par poll
est une valeur de descripteur de fichier brut, pas un objet de type fichier. Vous avez probablement besoin d'utiliser l'objet de fichier d'origine pour lire les données, et non la valeur retournée par sondage.
Autres conseils
Il semble que vous souhaitez modifier urllib avec ce patch . Gardez à l'esprit, il y a une raison pour laquelle ce code n'a pas été publié. Il n'a pas été complètement revu.
EDIT: En fait, je pense que vous voulez modifier httplib avec autre correctif .