2009-05-27 4 views
0

Ich habe den Fehler http://bugs.python.org/issue1327971 bei dem Versuch, ein dateiähnliches Objekt abzurufen, das von urllib2.urlopen() zurückgegeben wird, aufgerufen.Verwendung der Abfrage für ein dateiähnliches Objekt, das von urllib2.urlopen() zurückgegeben wird?

Leider bin ich relativ neu zu Python, kann ich nicht wirklich aus den Antworten ermitteln, wie Sie das Problem umgehen, da sie hauptsächlich darauf ausgerichtet scheinen, den Fehler zu beheben, anstatt den Code zu hacken, der es zum Funktionieren bringt. Hier

ist eine destillierte Version von meinem Code, der den Fehler wirft:

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 

und der Fehler, die ausgelöst wird, wenn ich es auf Python laufen 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' 

Update: Ich glaube nicht, möchte die Systembibliotheken ändern.

Antwort

1

Wenn Sie nicht möchten, dass Sie Systembibliotheken Sie ändern können httplib auch on the fly Patch des Patches in der Bug-Report zum Spiel:

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 
# ... 

Sie dann einen Fehler auf fd.read(4096) erhalten, weil die fd zurück von poll ist ein Raw-Datei-Deskriptorwert, kein dateiähnliches Objekt. Wahrscheinlich müssen Sie das ursprüngliche Dateiobjekt verwenden, um die Daten zu lesen, und nicht den von der Abfrage zurückgegebenen Wert.

0

Es sieht so aus, als ob Sie urllib mit this patch ändern möchten. Denken Sie daran, es gibt einen Grund, warum dieser Code nicht veröffentlicht wurde. Es wurde nicht vollständig überprüft.

EDIT: Eigentlich glaube ich, dass Sie httplib mit the other patch ändern möchten.

Verwandte Themen