2009-02-12 7 views
23
File "/usr/local/lib/python3.0/cgi.py", line 477, in __init__ 
    self.read_urlencoded() 
    File "/usr/local/lib/python3.0/cgi.py", line 577, in read_urlencoded 
    self.strict_parsing): 
    File "/usr/local/lib/python3.0/urllib/parse.py", line 377, in parse_qsl 
    pairs = [s2 for s1 in qs.split('&') for s2 in s1.split(';')] 
TypeError: Type str doesn't support the buffer API 

Kann mir jemand auf, wie man dies vermeiden? Ich bekomme es durch Feed-Daten in die cgi.Fieldstorage und ich kann es nicht anders zu tun scheinen.Python 3.0 urllib.parse Fehler "Typ str unterstützt nicht die Puffer-API"

Antwort

28

urllib versucht zu tun:

b'a,b'.split(',') 

Welche funktioniert nicht. Byte-Strings und Unicode-Strings mischen sich in Py3k sogar noch weniger als zuvor - absichtlich, um Kodierungsprobleme eher früher als später zu verfälschen.

Also der Fehler ist eher undurchsichtig sagen Sie "Sie können nicht eine Byte-Zeichenfolge an urllib.parse übergeben". Vermutlich machen Sie eine POST-Anfrage, bei der die formcodierte Zeichenkette als Inhaltskörper in cgi kommt; Der content body ist immer noch eine byte-Zeichenkette/stream, so dass er nun mit der neuen urllib kollidiert.

Also ja, es ist ein Fehler in cgi.py, noch ein Opfer der 2to3-Konvertierung, die nicht richtig für das neue String-Modell behoben wurde. Es sollte den eingehenden Byte-Stream in Zeichen konvertieren, bevor sie an urllib übergeben werden.

Erwähnte ich, dass die Bibliotheken von Python 3.0 (besonders webbezogene) immer noch ziemlich shonky sind? :-)

+0

Yeah. Bis jetzt habe ich große Probleme mit CGI, Urllib und WSGiref bemerkt. Ich hoffe, dass sie bald behoben werden. :( –

+0

In der Tat. Momentum in WEB-SIG scheint zu einem Halt gekommen zu sein; niemand scheint das Eigentum an dem Problem zu wollen. Sehr enttäuschend. – bobince

+0

Ich glaube, das sollte endlich richtig in 3.2 funktionieren (siehe http: // Bugs .python.org/issue4953). – ncoghlan

13

Aus dem Python-Lernprogramm (http://www.python.org/doc/3.0/tutorial/stdlib.html) gibt es ein Beispiel für die Verwendung der Methode urlopen. Es wirft den gleichen Fehler auf.

Sie müssen die Str-Funktion verwenden, um das Byte-Dingo in eine Zeichenfolge mit der richtigen Codierung zu konvertieren. Wie folgt:

for line in urlopen('http://tycho.usno.navy.mil/cgi-bin/timer.pl'): 
    lineStr = str(line, encoding='utf8') 
    if 'EST' in lineStr or 'EDT' in lineStr: # look for Eastern Time 
     print(lineStr) 
+3

Es wäre wirklich interessant, eine Lösung bereitzustellen, die mit beiden Versionen von Python zusammenarbeitet. – sorin

Verwandte Themen