开始

我尝试升级服务器上的 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
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$ source ~/.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
$ sudo tar xvzf openssl-1.1.1.tar.gz
$ cd openssl-1.1.1/
$ sudo ./config --prefix=/usr/local/openssl-1.1.1 shared zlib
$ sudo make depend
$ sudo make
$ sudo make test
$ sudo make install

让我们检查一下它是否已安装。 如果如下所示,那就OK。

$ sudo ls -l /usr/local/openssl-1.1.1
total 0
drwxr-xr-x 2 root root 37 Jul 11 13:57 bin
drwxr-xr-x 3 root root 21 Jul 11 13:57 include
drwxr-xr-x 4 root root 159 Jul 11 13:57 lib
drwxr-xr-x 4 root root 28 Jul 11 13:58 share
drwxr-xr-x 5 root root 140 Jul 11 13:57 ssl

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
TLS_AES_256_GCM_SHA384 TLSv1.3 Kx=any Au=any Enc=AESGCM(256) Mac=AEAD
TLS_CHACHA20_POLY1305_SHA256 TLSv1.3 Kx=any Au=any Enc=CHACHA20/POLY1305(256) Mac=AEAD
TLS_AES_128_GCM_SHA256 TLSv1.3 Kx=any Au=any Enc=AESGCM(128) Mac=AEAD

现在您已经安装了最新的 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 1.0.2k-fips 26 Jan 2017

我一直没能做到。 没有,但服务器上肯定应该有适当的 OpenSSL。 这意味着它可能与以前的版本冲突。 注销并重新登录无法解决问题。 我刚刚安装的 OpenSSL 位于:
因此,让我们用绝对路径来检查它。/usr/local/openssl-1.1.1/bin/openssl

$ /usr/local/openssl-1.1.1/bin/openssl version
OpenSSL 1.1.1 11 Sep 2018

搞定。 如果你用绝对路径指定它,它会正常工作,这意味着你已经能够正确安装它,但是当你输入命令 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
OpenSSL 1.1.1 11 Sep 2018

成功了。 现在看起来您终于可以使用 pyenv 了。

$  pyenv install 3.11.3

ModuleNotFoundError: No module named '_ssl'
ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?

这可不好。
当我查找它时,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
make depend && make _tests
make[1]: Entering directory `/usr/local/src/openssl-1.1.1'
make[1]: Leaving directory `/usr/local/src/openssl-1.1.1'
make[1]: Entering directory `/usr/local/src/openssl-1.1.1'
( cd test; \
mkdir -p test-runs; \
SRCTOP=../. \
BLDTOP=../. \
RESULT_D=test-runs \
PERL="/usr/bin/perl" \
EXE_EXT= \
OPENSSL_ENGINES=`cd .././engines 2>/dev/null && pwd` \
OPENSSL_DEBUG_MEMORY=on \
/usr/bin/perl .././test/run_tests.pl )
Can't locate Test/Harness.pm in @INC (@INC contains: /usr/local/src/openssl-1.1.1/test/../util/perl /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at .././test/run_tests.pl line 112.
BEGIN failed--compilation aborted at .././test/run_tests.pl line 112.
make[1]: *** [_tests] Error 2
make[1]: Leaving directory `/usr/local/src/openssl-1.1.1'
make: *** [tests] Error 2

解决办法:
如果系统中没有 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 xz-devel -y
yum install python-backports-lzma -y

亲测问题已解决。

有人使用如下两个命令解决问题,但是亲测没有这两个包。

yum install liblzma-dev -y
yum install libbz2-dev -y

成就

我认为这次会起作用,所以我又运行了一次。pyenv

$ pyenv install 3.11.3

Downloading Python-3.11.3.tar.xz...
-> https://www.python.org/ftp/python/3.11.3/Python-3.11.3.tar.xz
Installing Python-3.11.3...
Installed Python-3.11.3 to /root/.pyenv/versions/3.11.3

我终于能够安装 python 3.11.3。

使用以下命令检查安装是否完成。 标有星号的 ID 是当前环境。

$ pyenv versions

为了默认使用 python 3.11.3,

$ pyenv global 3.11.3

并运行

$ python -V
Python 3.11.3

如果显示,则表示安装完成。

现在,您可以在保留旧 Python 的同时使用新 Python。