Linux / 疑难杂症 · 22 2 月, 2025 0

CentOS7编译安装包含SSL模块的Python3.10:解决SSLError错误

为什么会有这篇文章

首先,已经作古的CentOS7.9通过YUM能够安装Python3的最高版本为3.6。

笔者为了能够正常使用Ansible,尝试在CentOS7.9上编译安装Python3.10。虽然Python能启动,但当使用pip的时候,便会报这样的错误:

WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")'

这是由于编译Python的时候没有包含OpenSSL导致的。Python3.10需要OpenSSL最低版本为v1.1.1,不支持CentOS7.9内置的v1.0.1。

编译包含SSL的Python3.10

有上述内容可知,想要编译包含SSL模块的Python,首先需要升级OpenSSL。以下操作均为root权限执行。

1. 安装OpenSSL1.1

执行以下命令:

yum install -y epel-release
yum install -y openssl11-devel

NOTE:如果软件源过期导致404,请参考这篇文章解决。

2. 编译安装Python3.10

cd到适当的目录,执行以下命令:

# 安装依赖,如果已经安装则可以省略
yum groupinstall -y "Development Tools"
yum install -y openssl-devel bzip2-devel libffi-devel

# 下载解压Python3.10
wget https://www.python.org/ftp/python/3.10.9/Python-3.10.9.tgz
tar zxvf Python-3.10.9.tgz

# 编译安装
cd Python-3.10.9
## !!👇最关键的一步
sed -i 's/PKG_CONFIG openssl /PKG_CONFIG openssl11 /g' configure
./configure --enable-optimizations
make altinstall

此时Python被安装在了/usr/local/bin中,root用户无法直接运行。可以用以下命令将Python链接到root可执行的目录中:

# 注意:如果系统中原先安装了Python3,则需要事先将其备份到其他地方,或者用yum autoremove卸载。
ln -s /usr/local/bin/python3.10 /usr/bin/python3
ln -s /usr/local/bin/pip3.10 /usr/bin/pip3

用以下命令验证安装。如果没有报错则SSL模块安装成功。

python3 -m ssl