记录使用pip命令的一次踩坑

pip

pip 是 Python 的包管理器。这意味着它是一个工具,允许你安装和管理不属于标准库的其他库和依赖。

issue

issue:pip报错:ValueError: check_hostname requires server_hostname

记录使用pip命令的一次踩坑

今天使用dirsearch,突然抽风报错,说缺少依赖,就安装依赖呗,dirsearch下有个文件requirements.txt,记录了其所需的依赖。

1
pip install -r requirements.txt

执行命令报错:

ERROR: Exception:

Traceback (most recent call last):
File “d:\python\lib\site-packages\pip_internal\cli\base_command.py”, line 180, in _main
status = self.run(options, args)
File “d:\python\lib\site-packages\pip_internal\cli\req_command.py”, line 205, in wrapper
return func(self, options, args)
File “d:\python\lib\site-packages\pip_internal\commands\install.py”, line 318, in run
requirement_set = resolver.resolve(
File “d:\python\lib\site-packages\pip_internal\resolution\resolvelib\resolver.py”, line 127……

报错非常长,我习惯性的从ERROR后截取一段来搜索,搜索报错有两种原因:

1.pip版本过老

2.网络问题(更换国内镜像)

检查报错原因1

这里习惯性的尝试了直接使用解决方法,升级pip

1
python -m pip install --upgrade pip

然后又是一堆报错,搜索报错的原因,提示我尝试清除缓存

1
pip cache purge

又报错:

ERROR: No matching packages

搜索报错,网上给出的原因:缓存已经被清空或者是pip 版本较老导致的。

解决办法:

  1. 升级pip:在命令行中执行 python -m pip install –upgrade pip命令,升级 pip到最新版本。然后再尝试执行 pip cache purge 命令。
  2. 直接删除缓存目录:在命令行中执行以下命令,手动删除 pip 的缓存目录:
    • Windows:rmdir /s %HOME%\AppData\Local\pip\Cache
    • Linux/MacOS:rm -rf ~/.cache/pi

看到这个回答,我想这不是形成了闭环吗?

到这里其实已经花费了很多时间,从互联网找答案真的很消耗耐心,各种信息里需要筛选正确的答案,很容易走弯路。

这个时候我反而安静下来了,我仔细想了一下 pip更新很快吗?我安装的pip版本是多少呢?

1
2
pip --version
pip 21.1.3 from d:\python\lib\site-packages\pip (python 3.9)

当我看到21.1.3 我内心大概有了猜测,搜索“pip 21.1.3 ERROR: No matching packages”,得到一个答案:

在 pip 版本 20.3 或更高版本中,pip cache purge 命令已经被废弃,并且在最新版本的pip中已经被删除。因此,如果您使用的是 pip 版本 21.1.3,执行 pip cache purge 命令会提示 “ERROR: No matching packages”,这是因为此命令已经不存在了。

这个时候我直接搜索了全部的报错信息:

ERROR: Exception:
Traceback (most recent call last):
File “d:\python\lib\site-packages\pip_internal\cli\base_command.py”, line 180, in _main
status = self.run(options, args)
File “d:\python\lib\site-packages\pip_internal\cli\req_command.py”, line 205, in wrapper
return func(self, options, args)
File “d:\python\lib\site-packages\pip_internal\commands\install.py”, line 318, in run
requirement_set = resolver.resolve(
File “d:\python\lib\site-packages\pip_internal\resolution\resolvelib\resolver.py”, line 127, in resolve
result = self._result = resolver.resolve(
File “d:\python\lib\site-packages\pip_vendor\resolvelib\resolvers.py”, line 473, in resolve
state = resolution.resolve(requirements, max_rounds=max_rounds)
File “d:\python\lib\site-packages\pip_vendor\resolvelib\resolvers.py”, line 341, in resolve
name, crit = self._merge_into_criterion(r, parent=None)
File “d:\python\lib\site-packages\pip_vendor\resolvelib\resolvers.py”, line 172, in _merge_into_criterion
if not criterion.candidates:
File “d:\python\lib\site-packages\pip_vendor\resolvelib\structs.py”, line 139, in bool
return bool(self.sequence)
File “d:\python\lib\site-packages\pip_internal\resolution\resolvelib\found_candidates.py”, line 143, in bool
return any(self)
File “d:\python\lib\site-packages\pip_internal\resolution\resolvelib\found_candidates.py”, line 129, in
return (c for c in iterator if id(c) not in self.incompatible_ids)
File “d:\python\lib\site-packages\pip_internal\resolution\resolvelib\found_candidates.py”, line 30, in _iter_built
for version, func in infos:
File “d:\python\lib\site-packages\pip_internal\resolution\resolvelib\factory.py”, line 269, in iter_index_candidate_infos
result = self._finder.find_best_candidate(
File “d:\python\lib\site-packages\pip_internal\index\package_finder.py”, line 879, in find_best_candidate
candidates = self.find_all_candidates(project_name)
File “d:\python\lib\site-packages\pip_internal\index\package_finder.py”, line 824, in find_all_candidates
page_candidates = list(page_candidates_it)
File “d:\python\lib\site-packages\pip_internal\index\sources.py”, line 134, in page_candidates
yield from self._candidates_from_page(self._link)
File “d:\python\lib\site-packages\pip_internal\index\package_finder.py”, line 783, in process_project_url
html_page = self._link_collector.fetch_page(project_url)
File “d:\python\lib\site-packages\pip_internal\index\collector.py”, line 512, in fetch_page
return _get_html_page(location, session=self.session)
File “d:\python\lib\site-packages\pip_internal\index\collector.py”, line 422, in _get_html_page
resp = _get_html_response(url, session=session)
File “d:\python\lib\site-packages\pip_internal\index\collector.py”, line 120, in _get_html_response
resp = session.get(
File “d:\python\lib\site-packages\pip_vendor\requests\sessions.py”, line 555, in get
return self.request(‘GET’, url, kwargs)
File “d:\python\lib\site-packages\pip_internal\network\session.py”, line 449, in request
return super().request(method, url, *args, kwargs)
File “d:\python\lib\site-packages\pip_vendor\requests\sessions.py”, line 542, in request
resp = self.send(prep, send_kwargs)
File “d:\python\lib\site-packages\pip_vendor\requests\sessions.py”, line 655, in send
r = adapter.send(request, kwargs)
File “d:\python\lib\site-packages\pip_vendor\cachecontrol\adapter.py”, line 53, in send
resp = super(CacheControlAdapter, self).send(request, **kw)
File “d:\python\lib\site-packages\pip_vendor\requests\adapters.py”, line 439, in send
resp = conn.urlopen(
File “d:\python\lib\site-packages\pip_vendor\urllib3\connectionpool.py”, line 696, in urlopen
self._prepare_proxy(conn)
File “d:\python\lib\site-packages\pip_vendor\urllib3\connectionpool.py”, line 964, in _prepare_proxy
conn.connect()
File “d:\python\lib\site-packages\pip_vendor\urllib3\connection.py”, line 359, in connect
conn = self._connect_tls_proxy(hostname, conn)
File “d:\python\lib\site-packages\pip_vendor\urllib3\connection.py”, line 500, in connect_tls_proxy
return ssl_wrap_socket(
File “d:\python\lib\site-packages\pip_vendor\urllib3\util\ssl
.py”, line 432, in ssl_wrap_socket
ssl_sock = ssl_wrap_socket_impl(sock, context, tls_in_tls)
File “d:\python\lib\site-packages\pip_vendor\urllib3\util\ssl
.py”, line 474, in _ssl_wrap_socket_impl
return ssl_context.wrap_socket(sock)
File “d:\python\lib\ssl.py”, line 500, in wrap_socket
return self.sslsocket_class._create(
File “d:\python\lib\ssl.py”, line 997, in _create
raise ValueError(“check_hostname requires server_hostname”)
ValueError: check_hostname requires server_hostname

答案

这个报错是由于 pip 在使用 TLS 代理时出现了问题。

问题可能是由于您使用的代理服务器没有正确配置 TLS 证书,或者是由于代理服务器返回的响应中缺少必要的信息导致的。

📌我看到这个回答,马上就明白可能是因为我开了网络代理的原因。

📌关闭代理后,执行命令一切正常了。

做完这一切后,知道自己又陷入经验主义的错误后,想到了自己以前经常犯的错误:

报错的真正原因可能是在出现在头部,也可能在尾部,而不应该总是从ERROR开始跟踪报错

之后又仔细查看了报错,搜索了这么一个关键报错:

1
pip ValueError: check_hostname requires server_hostname

w3c的一个回答不错,还有分析:文章链接

分析如下:

出现这个错误的原因是使用了代理,由于”总”所周知的原因,有些外网需要一些特殊手段才能访问,而要访问这些网站就需要使用代理,作者的朋友当时就是代理没有关掉,所以在pip的时候才会报错。

为什么使用代理会出现这样的错误呢,作者找到了蛛丝马迹:pip的较新的版本有这样的一个要求,就是标记对pip仓库的信任,或者使用https进行数据传输(类似的问题作者在学习linux的时候也遇到过)。而使用代理会导致pip认为你请求的仓库不是安全的,所以安装失败,所以解决方法就是关闭代理,或者在代理中设置相关内容。

总结

pip报错

ERROR: Exception:

Traceback (most recent call last):
File “d:\python\lib\site-packages\pip_internal\cli\base_command.py”, line 180, in _main

……

ValueError: check_hostname requires server_hostname

一个解决办法

有可能是开启了网络代理的原因,请关闭网络代理尝试重新执行命令。


记录使用pip命令的一次踩坑
https://dbii.top/posts/20230609-1840438d.html
作者
Fraxdeo
发布于
2023年6月9日
更新于
2023年6月9日
许可协议