原答案地址
解决方法: Python 遭遇 ProxyError 问题记录
作者 DavyCloud
前言
C:\Users\Administrator>pip install dd
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
ERROR: Exception:
Traceback (most recent call last):File "D:\Anaconda3\lib\site-packages\pip\_internal\cli\base_command.py", line 173, in _mainstatus = self.run(options, args)File "D:\Anaconda3\lib\site-packages\pip\_internal\cli\req_command.py", line 203, in wrapperreturn func(self, options, args)File "D:\Anaconda3\lib\site-packages\pip\_internal\commands\install.py", line 315, in runrequirement_set = resolver.resolve(File "D:\Anaconda3\lib\site-packages\pip\_internal\resolution\resolvelib\resolver.py", line 94, in resolveresult = self._result = resolver.resolve(File "D:\Anaconda3\lib\site-packages\pip\_vendor\resolvelib\resolvers.py", line 472, in resolvestate = resolution.resolve(requirements, max_rounds=max_rounds)File "D:\Anaconda3\lib\site-packages\pip\_vendor\resolvelib\resolvers.py", line 341, in resolveself._add_to_criteria(self.state.criteria, r, parent=None)File "D:\Anaconda3\lib\site-packages\pip\_vendor\resolvelib\resolvers.py", line 172, in _add_to_criteriaif not criterion.candidates:File "D:\Anaconda3\lib\site-packages\pip\_vendor\resolvelib\structs.py", line 151, in __bool__return bool(self._sequence)File "D:\Anaconda3\lib\site-packages\pip\_internal\resolution\resolvelib\found_candidates.py", line 140, in __bool__return any(self)File "D:\Anaconda3\lib\site-packages\pip\_internal\resolution\resolvelib\found_candidates.py", line 128, in <genexpr>return (c for c in iterator if id(c) not in self._incompatible_ids)File "D:\Anaconda3\lib\site-packages\pip\_internal\resolution\resolvelib\found_candidates.py", line 29, in _iter_builtfor version, func in infos:File "D:\Anaconda3\lib\site-packages\pip\_internal\resolution\resolvelib\factory.py", line 272, in iter_index_candidate_infosresult = self._finder.find_best_candidate(File "D:\Anaconda3\lib\site-packages\pip\_internal\index\package_finder.py", line 851, in find_best_candidatecandidates = self.find_all_candidates(project_name)File "D:\Anaconda3\lib\site-packages\pip\_internal\index\package_finder.py", line 798, in find_all_candidatespage_candidates = list(page_candidates_it)File "D:\Anaconda3\lib\site-packages\pip\_internal\index\sources.py", line 134, in page_candidatesyield from self._candidates_from_page(self._link)File "D:\Anaconda3\lib\site-packages\pip\_internal\index\package_finder.py", line 758, in process_project_urlhtml_page = self._link_collector.fetch_page(project_url)File "D:\Anaconda3\lib\site-packages\pip\_internal\index\collector.py", line 490, in fetch_pagereturn _get_html_page(location, session=self.session)File "D:\Anaconda3\lib\site-packages\pip\_internal\index\collector.py", line 400, in _get_html_pageresp = _get_html_response(url, session=session)File "D:\Anaconda3\lib\site-packages\pip\_internal\index\collector.py", line 115, in _get_html_responseresp = session.get(File "D:\Anaconda3\lib\site-packages\pip\_vendor\requests\sessions.py", line 555, in getreturn self.request('GET', url, **kwargs)File "D:\Anaconda3\lib\site-packages\pip\_internal\network\session.py", line 454, in requestreturn super().request(method, url, *args, **kwargs)File "D:\Anaconda3\lib\site-packages\pip\_vendor\requests\sessions.py", line 542, in requestresp = self.send(prep, **send_kwargs)File "D:\Anaconda3\lib\site-packages\pip\_vendor\requests\sessions.py", line 655, in sendr = adapter.send(request, **kwargs)File "D:\Anaconda3\lib\site-packages\pip\_vendor\cachecontrol\adapter.py", line 53, in sendresp = super(CacheControlAdapter, self).send(request, **kw)File "D:\Anaconda3\lib\site-packages\pip\_vendor\requests\adapters.py", line 439, in sendresp = conn.urlopen(File "D:\Anaconda3\lib\site-packages\pip\_vendor\urllib3\connectionpool.py", line 696, in urlopenself._prepare_proxy(conn)File "D:\Anaconda3\lib\site-packages\pip\_vendor\urllib3\connectionpool.py", line 964, in _prepare_proxyconn.connect()File "D:\Anaconda3\lib\site-packages\pip\_vendor\urllib3\connection.py", line 359, in connectconn = self._connect_tls_proxy(hostname, conn)File "D:\Anaconda3\lib\site-packages\pip\_vendor\urllib3\connection.py", line 500, in _connect_tls_proxyreturn ssl_wrap_socket(File "D:\Anaconda3\lib\site-packages\pip\_vendor\urllib3\util\ssl_.py", line 453, in ssl_wrap_socketssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls)File "D:\Anaconda3\lib\site-packages\pip\_vendor\urllib3\util\ssl_.py", line 495, in _ssl_wrap_socket_implreturn ssl_context.wrap_socket(sock)File "D:\Anaconda3\lib\ssl.py", line 500, in wrap_socketreturn self.sslsocket_class._create(File "D:\Anaconda3\lib\ssl.py", line 997, in _createraise ValueError("check_hostname requires server_hostname")
ValueError: check_hostname requires server_hostname
之前用pip时下载module网速太慢,挂代理又报错,当时一头雾水,百度说关闭代理就行了,当时也没深究,换源下载安装了事。
最近闲下来,因为之前在别的电脑上使用pip挂代理访问一直都可以,还就想钻这个牛角尖,于是在网上搜了很多,有的说降级urllib,实测对pip无用,直到看到了这篇知乎,找到了根本原因。
原因总结
- urllib 和 urllib3 不是一个库,前者是 Python 标准库自带。
- 在代码中发现,当用户有传入 proxies 参数时,requests 是通过标准库提供的 getproxies 函数来获取系统代理服务器配置的:
# 如果是 python 2,则是 from urllib import getproxies
>> from urllib.request import getproxies
>> getproxies(){'http': 'http://127.0.0.1:7890', 'https': 'https://127.0.0.1:7890', 'ftp': 'ftp://127.0.0.1:7890'}`
- 在 Windows 系统中,先从环境变量获取,如果没有则从注册表获取。由于没有配置环境变量,自然结果是空,最终的结果要看 getproxies_registry
elif os.name == 'nt':def getproxies():"""Return a dictionary of scheme -> proxy server URL mappings.Returns settings gathered from the environment, if specified,or the registry."""return getproxies_environment() or getproxies_registry()
综上,原作者给出的方案是配置环境变量即可。
具体操作
- 先挂上代理

- 获得本机代理端口
C:\Users\Administrator>python
Python 3.8.5 (default, Sep 3 2020, 21:29:08) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32Warning:
This Python interpreter is in a conda environment, but the environment has
not been activated. Libraries may fail to load. To activate this environment
please see https://conda.io/activationType "help", "copyright", "credits" or "license" for more information.
>>> from urllib.request import getproxies
>>> getproxies()
{'https': 'http://127.0.0.1:11000', 'http': 'http://127.0.0.1:11000'}
此处获得代理端口为11000
- 创建环境变量

- 重启命令提示行,在挂代理的情况下使用pip验证成功


















