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

Quelqu'un peut-il me diriger sur la façon d'éviter cela? Je l'obtiens en alimentant des données dans le cgi.Fieldstorage et je ne peux pas sembler faire autrement.erreur Python 3.0 urllib.parse "Type str ne prend pas en charge l'API tampon"

Répondre

28

urllib essaie de faire:

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

qui ne fonctionne pas. Les chaînes d'octets et les chaînes Unicode se mélangent encore moins facilement dans Py3k qu'auparavant - délibérément, pour que les problèmes de codage se résolvent tôt ou tard. Donc l'erreur est plutôt opaque vous disant 'vous ne pouvez pas passer une chaîne d'octets à urllib.parse'. Vraisemblablement, vous faites une requête POST, où la chaîne encodée par un formulaire arrive dans cgi en tant que corps de contenu; le corps du contenu est toujours une chaîne/un flux d'octets de sorte qu'il se heurte maintenant au nouvel urllib. Donc, oui, c'est un bug dans cgi.py, une autre victime de la conversion 2to3 qui n'a pas été corrigée correctement pour le nouveau modèle de chaîne. Il devrait convertir le flux d'octets entrant en caractères avant de les passer à urllib. Est-ce que j'ai mentionné les bibliothèques de Python 3.0 (en particulier celles qui sont liées au Web) qui sont encore plutôt shonky? :-)

+0

Ouais. Jusqu'à présent, j'ai remarqué d'énormes problèmes avec cgi, urllib et wsgiref. J'espère qu'ils seront bientôt corrigés. :( –

+0

En effet, la dynamique de WEB-SIG semble s'être arrêtée, personne ne semble vouloir la propriété du problème, très décevant – bobince

+0

Je crois que cela devrait finalement fonctionner correctement dans 3.2 (voir http: // bugs .python.org/issue4953) – ncoghlan

13

Le tutoriel python (http://www.python.org/doc/3.0/tutorial/stdlib.html) contient un exemple d'utilisation de la méthode urlopen. Cela soulève la même erreur.

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) 

Vous devrez utiliser la fonction str pour convertir le byo thingo en chaîne avec le codage correct. Comme suit:

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

Il serait vraiment intéressant de fournir une solution qui fonctionne avec les deux versions de python. – sorin

Questions connexes