我在最近的python3 conda环境中通过pip install zipfile安装了当前master
base_url = ' http://............127.0.0.1 :8082'
request.get(base_url)
崩溃
并以 UnidodeError 结束
python3.6/encodings/idna.py",
第 165 行,在编码中
raise UnicodeError("标签为空或太长")
UnicodeError:标签为空或太长
也许你能抓住这个?
对于后代,完整的追溯是这样的:
>>> requests.get(base_url)
Traceback (most recent call last):
File "/Users/cory/.pyenv/versions/3.6.0/lib/python3.6/encodings/idna.py", line 165, in encode
raise UnicodeError("label empty or too long")
UnicodeError: label empty or too long
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/cory/Documents/Python/requests_org/requests/requests/api.py", line 72, in get
return request('get', url, params=params, **kwargs)
File "/Users/cory/Documents/Python/requests_org/requests/requests/api.py", line 58, in request
return session.request(method=method, url=url, **kwargs)
File "/Users/cory/Documents/Python/requests_org/requests/requests/sessions.py", line 493, in request
prep.url, proxies, stream, verify, cert
File "/Users/cory/Documents/Python/requests_org/requests/requests/sessions.py", line 666, in merge_environment_settings
env_proxies = get_environ_proxies(url, no_proxy=no_proxy)
File "/Users/cory/Documents/Python/requests_org/requests/requests/utils.py", line 692, in get_environ_proxies
if should_bypass_proxies(url, no_proxy=no_proxy):
File "/Users/cory/Documents/Python/requests_org/requests/requests/utils.py", line 676, in should_bypass_proxies
bypass = proxy_bypass(netloc)
File "/Users/cory/.pyenv/versions/3.6.0/lib/python3.6/urllib/request.py", line 2616, in proxy_bypass
return proxy_bypass_macosx_sysconf(host)
File "/Users/cory/.pyenv/versions/3.6.0/lib/python3.6/urllib/request.py", line 2593, in proxy_bypass_macosx_sysconf
return _proxy_bypass_macosx_sysconf(host, proxy_settings)
File "/Users/cory/.pyenv/versions/3.6.0/lib/python3.6/urllib/request.py", line 2566, in _proxy_bypass_macosx_sysconf
hostIP = socket.gethostbyname(hostonly)
UnicodeError: encoding with 'idna' codec failed (UnicodeError: label empty or too long)
我认为我们对此无能为力。 该错误来自标准库(特别是在 urllib proxy_bypass
函数中)。 它只出现在 Python 3 上,感觉需要调用socket.gethostbyname
。 这个函数会自动对一个 unicode 主机名进行 IDNA 编码,即使在这种根本没有必要的情况下,它的 IDNA 编码器也会正确地拒绝它。
我们可以解决这个问题的唯一方法是转向更智能的 URL 处理实现,以某种形式规范化 URL。 最好的候选者是超链接,但超链接也出于类似的原因对此表示反对(它尝试 IDNA 编码并失败)。
这意味着我们充其量可以通过使用 URL 主机规范器扩展超链接来解决这个问题,然后处理它。 但是,WHATWG URL 规范似乎也禁止这种形式的 URL。 如果确实如此,我不确定为什么,因为 Chrome 会对其进行规范化(尽管 Safari 不会)。
鉴于执行此操作所需的工作量,我认为没有任何理由容忍它。 该 URL 与任何可以合理预期工作的东西相距甚远,所以我倾向于将其关闭,因为它无法修复。
@johnpaulhayes这仍然不是请求库的问题,但由于我也遇到了它,我想我会放弃更新。
似乎不是网址的总长度,只是其中的一部分。 当主机名的第一部分长度超过 64 个字符时,idna 编码器似乎会在 url 上中断。 无论出于何种原因,它也包括其中的密钥和秘密。 因此,要么避免使用 python3,要么避免使用长的“ key:secret@example ”字符串(可能是避免使用长的 api 键),直到底层功能得到修复。 我昨天向 python 跟踪器提交了一个错误。
对于那些对 python 方面的问题感兴趣的人
https://bugs.python.org/issue32958
最有用的评论
对于那些对 python 方面的问题感兴趣的人
https://bugs.python.org/issue32958