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

任何人都可以指导我如何避免这种情况?我通过将数据提供给cgi.Fieldstorage来获得它,我似乎无法以其他方式进行操作。Python 3.0 urllib.parse错误“类型str不支持缓冲区API”

回答

28

的urllib正试图做的事:

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

不工作。字节字符串和unicode字符串在Py3k中的混合比以前更加平滑 - 故意使编码问题早晚出错。

所以这个错误是相当不透明的告诉你'你不能传递一个字节字符串到urllib.parse'。据推测你正在做一个POST请求,其中表单编码的字符串作为内容主体进入cgi;内容主体仍然是字节字符串/流,因此它现在与新的urllib冲突。

所以是的,这是cgi.py中的一个错误,但是2to3转换的另一个受害者尚未针对新字符串模型进行适当修复。它应该将传入的字节流转换为字符,然后再将它们传递给urllib。

我有没有提到Python 3.0的库(尤其是与网络相关的)仍然比较轻快? :-)

+0

是的。到目前为止,我已经注意到cgi,urllib和wsgiref的巨大问题。我希望他们尽快得到解决。 :( – 2009-02-12 17:09:57

+0

事实上,在WEB-SIG中的动力似乎已经停止,没有人似乎想要拥有这个问题,非常令人失望 – bobince 2009-02-12 18:24:01

13

从python教程(http://www.python.org/doc/3.0/tutorial/stdlib.html)有一个使用urlopen方法的例子。它引发了同样的错误。

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) 

您需要使用str函数将字节thingo转换为正确编码的字符串。如下:

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) 
相关问题