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

Était-ce utile?

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 .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top