2009-02-12 2 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 

Qualcuno può dirmi come evitarlo? Sto ottenendo attraverso i dati di alimentazione nel cgi.Fieldstorage e non riesco a farlo in altro modo.Python 3.0 urllib.parse errore "Tipo str non supporta l'API del buffer"

risposta

28

urllib sta cercando di fare:

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

che non funziona. le stringhe di byte e le stringhe Unicode si mescolano in Py3k in modo ancora meno fluido di quanto non fossero abituati a - deliberatamente, per far sì che i problemi di codifica finissero prima o poi.

Quindi l'errore è piuttosto opaco chiedendo "non è possibile passare una stringa di byte a urllib.parse". Presumibilmente si sta facendo una richiesta POST, in cui la stringa codificata in forma sta entrando in cgi come corpo di contenuto; il corpo del contenuto è ancora una stringa/flusso di byte, quindi ora si scontra con il nuovo urllib.

Quindi sì, si tratta di un bug in cgi.py, un'altra vittima della conversione 2to3 che non è stata corretta correttamente per il nuovo modello di stringa. Dovrebbe essere la conversione del flusso di byte in entrata in caratteri prima di passarli a urllib.

Ho già detto che le librerie di Python 3.0 (specialmente quelle relative al Web) sono ancora piuttosto shonky? :-)

+0

Sì. Finora ho notato enormi problemi con cgi, urllib e wsgiref. Spero che vengano risolti presto. :( –

+0

Infatti, il momento di WEB-SIG sembra essersi fermato: nessuno sembra voler assumere la proprietà del problema Molto deludente – bobince

+0

Credo che questo dovrebbe funzionare finalmente correttamente in 3.2 (vedere http: // bug .python.org/issue4953). – ncoghlan

13

Dal tutorial su Python (http://www.python.org/doc/3.0/tutorial/stdlib.html) c'è un esempio di utilizzo del metodo urlopen. Solleva lo stesso errore.

for line in urlopen('http://tycho.usno.navy.mil/cgi-bin/timer.pl'): 
    if 'EST' in line or 'EDT' in line: # look for Eastern Time 
     print(line) 

Avrete bisogno di utilizzare la funzione str per convertire il byte thingo in una stringa con la codifica corretta. Come segue:

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

Sarebbe davvero interessante fornire una soluzione che funzioni con entrambe le versioni di python. – sorin