一次Python无法安装模块的问题探索与解决之旅

这篇具有很好参考价值的文章主要介绍了一次Python无法安装模块的问题探索与解决之旅。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

源起

在Windows 10系统中安装 Python 3.11.5版本(目前最新版)并安装模块 (比如flask),安装步骤很简单:

  1. 到官方下载安装档https://www.python.org/downloads/
  2. 点击安装文件安装Python
  3. 到命令行执行 pip install packagename 安装扩展的模块

在一般的环境下, 这都没什么问题,到时在企业内部环境中, https的根证书是自行颁布的,虽然在浏览器中访问这个地址正常,但是使用 pip install 命令就是无法安装, 报的错误就是证书不对, 握手失败,无法建立连接, 完整的错误信息如下:

WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLError(1, '[SSL: UNSAFE_LEGACY_RENEGOTIATION_DISABLED] unsafe legacy renegotiation disabled (_ssl.c:1006)'))': /simple/flask/
WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLError(1, '[SSL: UNSAFE_LEGACY_RENEGOTIATION_DISABLED] unsafe legacy renegotiation disabled (_ssl.c:1006)'))': /simple/flask/
WARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLError(1, '[SSL: UNSAFE_LEGACY_RENEGOTIATION_DISABLED] unsafe legacy renegotiation disabled (_ssl.c:1006)'))': /simple/flask/
WARNING: Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLError(1, '[SSL: UNSAFE_LEGACY_RENEGOTIATION_DISABLED] unsafe legacy renegotiation disabled (_ssl.c:1006)'))': /simple/flask/
WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLError(1, '[SSL: UNSAFE_LEGACY_RENEGOTIATION_DISABLED] unsafe legacy renegotiation disabled (_ssl.c:1006)'))': /simple/flask/
Could not fetch URL https://pypi.org/simple/flask/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/flask/ (Caused by SSLError(SSLError(1, '[SSL: UNSAFE_LEGACY_RENEGOTIATION_DISABLED] unsafe legacy renegotiation disabled (_ssl.c:1006)'))) - skipping
ERROR: Could not find a version that satisfies the requirement flask (from versions: none)
ERROR: No matching distribution found for flask
Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/pip/ (Caused by SSLError(SSLError(1, '[SSL: UNSAFE_LEGACY_RENEGOTIATION_DISABLED] unsafe legacy renegotiation disabled (_ssl.c:1006)'))) - skipping

原因分析与方法探求

从上面的错误可以看到, pip 在安装扩展包的时候会从 https://pypi.org/simple/flask/ 下载对应的包的问题, 但是pip 访问https站点的时候又没有正确的证书。
在当地机器的浏览器中https://pypi.org/simple/flask/打开这个地址, 可以正常访问。

忽略证书访问:

于是就想: 是否可以忽略证书访问呢? 找了一下,是可以通过 --trusted-host 命令选项设置, 于是使用如下命令:

pip install --trusted-host pypi.org flash

不行, 是站点不够吗?于是使用如下:

pip install  --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host=files.pythonhosted.org flash

还是不行, 改方式宣告失败

添加证书访问

Python有自身的证书库文件, 位于安装目录的: Lib\site-packages\certifi\cacert.pem,所以有种思路就是把站点的证书附加到这个证书库文件中,于是到浏览器中下载证书,保存证书名为: pypi.crt。
如何在流量器下载证书, 可以参考 : 如何在浏览器中下载网站的https证书

添加的方式可以有两种:

  1. 使用命令行: type pypi.crt >> Python\Python311\Lib\site-packages\certifi\cacert.pem
  2. 直接用记事本打开这两个文件, 把pypi.crt 的内容复制到cacert.pem 中

复制完成之后, 执行pip install flash 还是失败, 是pip 找不到这个证书库吗 ?于是分别尝试下面两种方式显示指定证书库文件

  1. 设置证书库文件的环境变量 set PIP_CERT=C:\Python\Python311\Lib\site-packages\certifi\cacert.pem
  2. 使用 --cert命令选项指定证书:类似: pip --cert \Lib\site-packages\pip\_vendor\certifi\cacert.pem install flask

还是失败。

又猜想是不是pip 的版本原因,于是使用 pip3 又试了一轮, 还是不行。

确认证书

到这, 就有点手足无措了, 难道是内部封装的这个站点的证书有什么不一样吗? 联想到在Java开发时, 使用Maven下载远端库的时候也有相同的问题,当时的解决方法就是: 在浏览器下载证书, 导入到Java的证书库中, 之后就可以了。 于是想到把https://pypi.org/ 的证书导入到Java证书库中试试。
这里有提供一个Java类工具:
SSLPoke.class:可以验证https 的站点是否可以访问
可以到如下地址下载:
https://download.csdn.net/download/oscar999/18855774
于是先用Java测试: java SSLPoke pypi.org 443
果然无法访问:


sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.validator.PKIXValidator.doBuild(Unknown Source)
        at sun.security.validator.PKIXValidator.engineValidate(Unknown Source)
        at sun.security.validator.Validator.validate(Unknown Source)

使用Java的keytool 工具导入 pypi站点的https证书,

导入命令如下:

keytool -import -trustcacerts -alias pypi -file pypi.cer -keystore  %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit

关于如何导入https到Java证书库, 可以参考:

Java如何安装https证书
导入之后, 使用Java连接成功, 如下显示:

java SSLPoke pypi.org 443
Successfully connected

操作系统的证书

到这又产生了一个想法: Windows 本 身也有证书库 ,是否导入操作系统本身的证书库文件就可以了呢。
在运行输入 certmgr.msc 打开证书库管理。

一次Python无法安装模块的问题探索与解决之旅,160-Shell/Perl/Python,python,pip install,windows

打开后的界面如下:

一次Python无法安装模块的问题探索与解决之旅,160-Shell/Perl/Python,python,pip install,windows

在这里,尝试把pypi 的证书导入了根证书以及企业信任等目录, 发现都无效, 也就是导入后, Java依旧无法访问该https站点, 同理, pip 应该也就不行。

临时方案

无奈之下,就找了一个临时方案:文章来源地址https://www.toymoban.com/news/detail-732826.html

  1. 找一台非企业颁发证书的机器下载pip 的包的文件, 文件的后缀名是 *.whl, 因为有依赖关系, 会存在多个whl 文件。下载的命令是:
pip download flask
  1. 将这些文件复制到目标机器的某个目录,
  2. 执行 pip install *.whl 安装所有的包。 但是这里会失败,因为windows 的命令行不认识 * 的通配符。这里的解决方法是使用 Git 的bash 进行安装。(因为该机器安装了Git , 所以可以直接使用Git Bash, 也就是说, 在Linux系统中,pip install的命令是认识 *通配符的)。


到了这里,关于一次Python无法安装模块的问题探索与解决之旅的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Python】解决 pip 开了网络代理之后无法安装包的问题

    开了网络代理之后,python 的 pip 就无法安装包了,报如下错误: 想必很多同学都和我一样,配置了 pip 源为国内的清华源或阿里源,这样下载包的速度会快,以清华源为例,配置方法如下: 然而,配置清华源之后,pip 安装的时候就是从清华的镜像仓库来抓取安装包,但是清

    2024年02月08日
    浏览(28)
  • 解决问题:HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效。安装AspNetCoreModuleV2 模块即可

        缺少 AspNetCoreModuleV2 模块,下载安装即可。 ps:.net framework是可以直接发布,IIS指定就能正常访问的。但aspnetcore 项目略有不同,要额外安装一个模块,如果没有安装,会报HTTP 错误 500.19 - Internal Server Error的错。 1、官方版本地址:https://dotnet.microsoft.com/download/dotnet  根据需

    2024年02月12日
    浏览(33)
  • 记录一次在centos 8 下docker 安装reids 一直报错无法启动问题

    目录 1.首先翻看了网上大部分启动失败原因总结如下  可以使用docker logs reids查看启动失败原因 1.1启动挂载目录失败  通常是没有创建目录 1.2启动闪退  通常为配置文件 daemonize yes 没有改成 no 导致 1.3启动之后直接报错 Fatal: Can\\\'t initialize Background Jobs 然后无限重启  请不要

    2024年01月20日
    浏览(33)
  • 【Python错误:无法找到模块xxx】——完整解决方案

    【Python错误:无法找到模块xxx】——完整解决方案 在使用Python编程过程中,经常会遇到无法找到模块的错误。当你试图导入一个模块时,Python会在搜索路径中查找该模块。如果无法找到该模块,则会出现“no module named xxx”的错误提示。本文将提供一些常见的解决方案,帮助

    2024年02月05日
    浏览(42)
  • 探索Python的魔法世界,开启编程奇幻之旅!

      无需魔杖,只需键盘,Python将带你进入一个充满奇幻和创造力的世界。本篇博客将引领你走进Python的魔法大门,从编程新手蜕变为编码魔法师,开启一段激动人心的编程奇幻之旅。 如果你是一名编程初学者,并且想要掌握一门强大且广泛应用的编程语言,那么Python绝对是你

    2024年02月10日
    浏览(32)
  • 解决pip安装python-jenkins模块报“Could not find suitable distribution for Requirement.parse(‘pbr‘)”的问题

    相关版本: python-jenkins依赖pbr,其实还依赖six pip版本太低了,需要升级匹配版本 这是因为升级版本跨度太大导致的失败 解决办法:手动安装 安装成功 python2.7 pip 升级报错 def read(rel_path: str) -> str:

    2024年02月11日
    浏览(38)
  • ts解决依赖引入报错:无法找到模块“xxxxxx”的声明文件的报错问题

    依赖引入报错是因为 ts 没有识别当前引入的依赖,在 vite-env.d.ts 中声明该依赖即可解决,语法: declare module \\\"依赖名\\\"; 解决找不到模块“./App.vue”或其相应的类型声明。 解决router引入报错的问题 一些依赖报错问题的解决

    2024年02月11日
    浏览(34)
  • 嵌入式奇妙之旅:Python与树莓派编程深度探索

    💂 个人网站:【 海拥】【神级代码资源网站】【办公神器】 🤟 基于Web端打造的:👉轻量化工具创作平台 💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 在这个数字化的时代,嵌入式系统的应用越来越广泛,而树莓派作为一款强大的微型计算机,为我们提供

    2024年02月04日
    浏览(29)
  • 解决Opencv dnn模块无法使用onnx模型的问题(将onnx的动态输入改成静态)

    最近做人脸识别项目,想只用OpenCV自带的人脸检测和识别模块实现,使用OpenCV传统方法:Haar级联分类器人脸检测+LBPH算法人脸识别的教程已经有了,于是想着用OpenCV中的dnn模块来实现,dnn实现人脸检测也有(详细教程可见我的这篇博客https://blog.csdn.net/weixin_42149550/article/detai

    2024年02月05日
    浏览(33)
  • 探索 Python:发现有趣的库——第 1 章:数据可视化之旅

    在一个充满活力的科技世界中,数据分析专家“算法仙”和编程爱好者“代码侠”相遇了,决定一起踏上数据可视化的探险之旅。他们将运用 Matplotlib 和 Seaborn 这两个强大的 Python 库,将枯燥的数据转化为生动的图形。 算法仙 :你好,代码侠!今天我们将一起探索数据可视化

    2024年01月17日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包