在 CentOS 7 上使用 pyenv 安装最新版本的 Python(解决ModuleNotFoundError: No module named '_ssl'问题)
开始
我尝试升级服务器上的 python。 这花了相当多的时间,所以我在这里总结一下作为提醒。
本文主要解决ModuleNotFoundError: No module named ‘_ssl’问题。
环境
- CentOS 7 操作系统
- Python 3.6 和 Python 2.7 已预先包含在内。
1. 安装 pyenv
$ pyenv versions |
如果输出如下,则表示未安装。 如果您看到该版本,则表示该版本已安装,您可以跳过该版本。
bash: pyenv: 找不到命令…
pyenv 的安装基于以下文章。 以下是步骤:
https://www.cnblogs.com/zengzuo613/p/18399192
1-1. 安装使用 pyenv 所需的软件包
$ sudo yum install gcc zlib-devel bzip2 bzip2-devel readline readline-devel sqlite sqlite-devel openssl openssl-devel git libffi-devel |
1-2. 克隆主目录下的 pyenv 仓库
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv |
1-3. 将 pyenv 路径添加到 .bash_profile
$ echo 'export PATH="$HOME/.pyenv/bin:$PATH"' >> ~/.bash_profile |
版本
$ pyenv --version |
Pyenv 1.2.2-6-g694b551
2. 安装 Python (失败)
检查 Python 的最新可用版本。
$ pyenv install --list |
我选择了 3.11.3。
$ pyenv install 3.11.3 |
如果是这样,您应该能够毫无问题地安装 python 3.11.3。
ModuleNotFoundError: No module named ‘_ssl’
ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?请查阅 Wiki 页面以解决此问题。
https://github.com/pyenv/pyenv/wiki/Common-build-problems
我遇到了错误。 显然,错误在于没有名为 _ssl 的模块。
事实上,即使您键入以下内容来检查已安装的 Python 版本,它也不会出现。3.11.3
$ pyenv versions |
当我查的时候,我发现了很多文章。
明白了。 python 3.10.x 或更高版本似乎要求 open-ssl 的版本为 1.1.1 或更高版本。 根据 chatGPT 的说法,open-ssl 如下。
OpenSSL 是一个开源加密库和工具包。 它提供了多种与加密相关的功能,包括数据加密、解密和签名、证书创建和协议实现。
现在,让我们检查当前包含的 open-ssl 版本。
$ openssl version |
OpenSSL 1.0.2k-fips 26 1月 2017
事实上,版本是 1.0.2。 现在,让我们尝试升级。
3. 升级 OpenSSL
我尝试的第一件事是以下脚本。
sudo yum install openssl11-devel --allowerasing |
命令行错误:没有这样的选项:–allowerasing
我曾经是。
我尝试的下一个命令如下:
sudo yum install openssl11-devel |
0 个包因存储库保护而被排除 没有
可用的包 openssl11-devel。
我又回来了。
如果你仔细观察,你会发现它是这样写的。
此系统未向授权服务器注册。 您可以使用 subscription-manager 进行注册。
我明白了,它不是授权服务器,所以它不好。 是这样的吗? 当我查了一下,下面的文章出来了。
/etc/yum/pluginconf.d/subscription-manager.conf
您可以将 的值从 1 重写为 0。 从心理上讲,这样做比在发生什么事情时不得不重写它要容易得多。
因此enabled``sudo subscription-manager register
$ vi /etc/yum/pluginconf.d/subscription-manager.conf |
我把它改写成。enabled=0
您注册了吗? 顺便说一句,它又跑了。
及其开发包也一起安装。openssl11``openssl11-devel
sudo yum install openssl11 openssl11-devel |
No package openssl11 available.
No package openssl11-devel available.
这可不好。
我忍不住了,所以我查了一下有没有办法直接从源码安装它,找到了下面的文章。
它看起来不错,所以我决定立即试一试。
3-1. 安装所需的软件包
它部分被我一开始安装的包覆盖,但我安装它时没有担心它。
$ sudo yum install -y zlib-devel perl-core make gcc |
3-2. 下载 OpenSSL
接下来,从源代码所在的站点下载 tar.gz 文件。
$ sudo curl https://www.openssl.org/source/openssl-1.1.1.tar.gz -o /usr/local/src/openssl-1.1.1.tar.gz |
3-3. 安装 OpenSSL
然后是 OpenSSL 的安装。
$ cd /usr/local/src |
让我们检查一下它是否已安装。 如果如下所示,那就OK。
$ sudo ls -l /usr/local/openssl-1.1.1 |
3-4. 添加 OpenSSL 库
显然,您需要执行一些称为添加库的操作。
我参考了以下网站。
$ vi /etc/ld.so.conf.d/openssl-1.1.1.conf |
如
/usr/local/openssl-1.1.1/lib |
我写道。
3-5. 更新缓存文件
$ sudo ldconfig |
3-6. 确认已添加库
$ sudo ldconfig -p | grep libssl |
有了这个
libssl.so.1.1 (libc6,x86-64) => /usr/local/openssl-1.1.1/lib/libssl.so.1.1
libssl.so (libc6,x86-64) => /usr/local/openssl-1.1.1/lib/libssl.so
被添加(如果有)确定。
3-7. 操作检查
您可以看到它已安装,使用下面的命令没有任何问题。
Copied!
$ sudo /usr/local/openssl-1.1.1/bin/openssl ciphers -v TLSv1.3 |
现在您已经安装了最新的 OpenSSL,您可以放心地进行安装。pyenv install
再次运行 pyenv
$ pyenv install 3.11.3 |
ModuleNotFoundError: No module named ‘_ssl’
ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?
这可不好。
OpenSSL 应该已经安装没有任何问题。 你可以安装它,对吧? 所以我去查一下。
$ openssl version |
我一直没能做到。 没有,但服务器上肯定应该有适当的 OpenSSL。 这意味着它可能与以前的版本冲突。 注销并重新登录无法解决问题。 我刚刚安装的 OpenSSL 位于:
因此,让我们用绝对路径来检查它。/usr/local/openssl-1.1.1/bin/openssl
$ /usr/local/openssl-1.1.1/bin/openssl version |
搞定。 如果你用绝对路径指定它,它会正常工作,这意味着你已经能够正确安装它,但是当你输入命令 openssl 时,会先加载传统的 openssl。 这似乎可以通过在传统 openssl 所在的 PATH 之前指定 PATH 来解决。/usr/local/openssl-1.1.1/bin/openssl
因此
$ vi .bashrc |
如
export PATH="/usr/local/openssl-1.1.1/bin/:$PATH" |
我认为如果是这样就好了。
source ~/.bashrc |
将更改反映为
$ openssl version |
成功了。 现在看起来您终于可以使用 pyenv 了。
$ pyenv install 3.11.3 |
这可不好。
当我查找它时,Python 版本似乎不起作用,因为 OpenSSL 安装在与标准位置不同的位置(请参阅以下文章)。 因此,您似乎需要将 OpenSSL 的位置分配给一个名为“OpenSSL 头库”的环境变量,以便您可以找到它。PYTHON_CONFIGURE_OPTS
由于安装位置与上述文章不同,因此请执行以下仅在此处重写的命令。
$ echo 'export PYTHON_CONFIGURE_OPTS="--with-openssl=/usr/local/openssl-1.1.1"' >> ~/.bashrc |
其他问题
(1)安装openssl 1.1.1时,会遇到缺少 Test::Harness Perl 模块的问题:
[root@localhost openssl-1.1.1]# make test |
解决办法:
如果系统中没有 cpan 或 cpanm,可以先安装它们:
yum install perl-CPAN |
然后使用 cpan 或 cpanm 安装 Test::Harness 模块:
cpan Test::Harness |
(2)遇到ModuleNotFoundError: No module named ‘_tkinter’错误:
解决办法:
yum install tk-devel |
(3)遇到ModuleNotFoundError: No module named ‘_lzma’错误:
yum install lzma -y |
亲测问题已解决。
有人使用如下两个命令解决问题,但是亲测没有这两个包。
yum install liblzma-dev -y |
成就
我认为这次会起作用,所以我又运行了一次。pyenv
$ pyenv install 3.11.3 |
我终于能够安装 python 3.11.3。
使用以下命令检查安装是否完成。 标有星号的 ID 是当前环境。
$ pyenv versions |
为了默认使用 python 3.11.3,
$ pyenv global 3.11.3 |
并运行
$ python -V |
如果显示,则表示安装完成。
现在,您可以在保留旧 Python 的同时使用新 Python。