我有一个脚本,我想继续使用,但看起来我要么必须为Python3中的错误找到一些解决方法,要么降级回2.6,因此也必须降级其他脚本。。。
希望这里已经有人找到了解决办法。
问题是,由于Python 3.0中有关字节和字符串的新更改,显然并不是所有库代码都经过测试。
我有一个从web服务器下载页面的脚本。这个脚本在Python2.6中作为url的一部分传递了用户名和密码,但在Python3.0中,这不再有效。
例如,这:
import urllib.request;
url = "http://username:password@server/file";
urllib.request.urlretrieve(url, "temp.dat");
失败,出现以下异常:
Traceback (most recent call last):
File "C:\Temp\test.py", line 5, in <module>
urllib.request.urlretrieve(url, "test.html");
File "C:\Python30\lib\urllib\request.py", line 134, in urlretrieve
return _urlopener.retrieve(url, filename, reporthook, data)
File "C:\Python30\lib\urllib\request.py", line 1476, in retrieve
fp = self.open(url, data)
File "C:\Python30\lib\urllib\request.py", line 1444, in open
return getattr(self, name)(url)
File "C:\Python30\lib\urllib\request.py", line 1618, in open_http
return self._open_generic_http(http.client.HTTPConnection, url, data)
File "C:\Python30\lib\urllib\request.py", line 1576, in _open_generic_http
auth = base64.b64encode(user_passwd).strip()
File "C:\Python30\lib\base64.py", line 56, in b64encode
raise TypeError("expected bytes, not %s" % s.__class__.__name__)
TypeError: expected bytes, not str
显然,base64编码现在需要字节并输出一个字符串,因此urlretrieve(或其中的一些代码)构建一个用户名:password的字符串,并尝试base64编码以获得简单的授权失败。
如果我改为使用urlopen,如下所示:
import urllib.request;
url = "http://username:password@server/file";
f = urllib.request.urlopen(url);
contents = f.read();
然后失败,出现以下异常:
Traceback (most recent call last):
File "C:\Temp\test.py", line 5, in <module>
f = urllib.request.urlopen(url);
File "C:\Python30\lib\urllib\request.py", line 122, in urlopen
return _opener.open(url, data, timeout)
File "C:\Python30\lib\urllib\request.py", line 359, in open
response = self._open(req, data)
File "C:\Python30\lib\urllib\request.py", line 377, in _open
'_open', req)
File "C:\Python30\lib\urllib\request.py", line 337, in _call_chain
result = func(*args)
File "C:\Python30\lib\urllib\request.py", line 1082, in http_open
return self.do_open(http.client.HTTPConnection, req)
File "C:\Python30\lib\urllib\request.py", line 1051, in do_open
h = http_class(host, timeout=req.timeout) # will parse host:port
File "C:\Python30\lib\http\client.py", line 620, in __init__
self._set_hostport(host, port)
File "C:\Python30\lib\http\client.py", line 632, in _set_hostport
raise InvalidURL("nonnumeric port: '%s'" % host[i+1:])
http.client.InvalidURL: nonnumeric port: 'password@server'
显然,这个“下一代url检索库”中的url解析不知道如何处理url中的用户名和密码。
我还有别的选择吗?
我的建议是在你能把3.0的东西分类之前,把你的2.*分支作为你的生产分支。
在转到Python3.0之前,我将等待一段时间。似乎有很多人在赶时间,但我只想把一切都整理好,并选择一个像样的第三方图书馆。这可能需要一年,可能需要18个月,但“升级”的压力对我来说真的很小。
直接从Py3k文档:http://docs.python.org/dev/py3k/library/urllib.request.html#examples
相关问题 更多 >
编程相关推荐