背景
在 CentOS 7.8版本 系统上编译安装 Python 3.11 时,经常遇到 ModuleNotFoundError: No module named '_ssl' 错误。这是因为系统自带的 OpenSSL 1.0.2 版本过旧,而 Python 3.11 需要 OpenSSL 1.1.1+ 版本。
解决方案总览
方法一:环境变量强制指定(推荐)
# 清理之前的编译
cd Python-3.11.11
make distclean
# 设置编译环境变量
export LDFLAGS="-L/usr/lib64 -lssl -lcrypto"
export CPPFLAGS="-I/usr/include/openssl11"
# 重新配置和编译
./configure \
--enable-optimizations \
--with-openssl=/usr \
--with-system-ffi
make -j$(nproc)
sudo make altinstall
方法二:临时符号链接调整
# 备份原有符号链接
sudo mv /usr/lib64/libssl.so /usr/lib64/libssl.so.bak
sudo mv /usr/lib64/libcrypto.so /usr/lib64/libcrypto.so.bak
# 创建指向新版本的符号链接
sudo ln -sf /usr/lib64/libssl.so.1.1 /usr/lib64/libssl.so
sudo ln -sf /usr/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so
# 编译安装 Python
cd Python-3.11.11
make distclean
./configure --enable-optimizations --with-openssl=/usr
make -j$(nproc)
sudo make altinstall
# 恢复原有符号链接(可选)
sudo mv /usr/lib64/libssl.so.bak /usr/lib64/libssl.so
sudo mv /usr/lib64/libcrypto.so.bak /usr/lib64/libcrypto.so
方法三:源码编译 OpenSSL
# 下载编译 OpenSSL 1.1.1
cd /tmp
wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz
tar -xzf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w
./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl shared zlib
make -j$(nproc)
sudo make install
# 设置环境变量
export LD_LIBRARY_PATH=/usr/local/openssl/lib:$LD_LIBRARY_PATH
export PATH=/usr/local/openssl/bin:$PATH
# 编译 Python
cd Python-3.11.11
make distclean
./configure --enable-optimizations --with-openssl=/usr/local/openssl
make -j$(nproc)
sudo make altinstall
详细步骤说明
1. 安装必要依赖
sudo yum install -y \
zlib-devel bzip2-devel openssl-devel \
sqlite-devel readline-devel libffi-devel \
tk-devel gdbm-devel libuuid-devel \
openssl11 openssl11-devel # 关键包
2. 下载 Python 源码
wget https://www.python.org/ftp/python/3.11.11/Python-3.11.11.tgz
tar -xzf Python-3.11.11.tgz
cd Python-3.11.11
3. 检查 OpenSSL 状态
# 检查系统 OpenSSL 版本
openssl version
# 检查 OpenSSL 1.1.1 库文件
ls -l /usr/lib64/libssl.so* /usr/lib64/libcrypto.so*
# 应该能看到:
# libssl.so.1.1 -> libssl.so.1.1.1k
# libcrypto.so.1.1 -> libcrypto.so.1.1.1k
4. 编译安装(采用方法一)
# 设置编译参数
export LDFLAGS="-L/usr/lib64 -lssl -lcrypto"
export CPPFLAGS="-I/usr/include/openssl11"
# 配置编译选项
./configure \
--enable-optimizations \
--with-openssl=/usr \
--with-system-ffi \
--enable-shared
# 编译并安装
make -j$(nproc)
sudo make altinstall # 重要:使用 altinstall 避免覆盖系统 Python
5. 验证安装
# 检查 Python 版本
python3.11 --version
# 验证 SSL 模块
python3.11 -c "import ssl; print('OpenSSL版本:', ssl.OPENSSL_VERSION)"
# 检查其他关键模块
python3.11 -c "import hashlib, uuid, lzma; print('所有模块正常')"
# 检查 pip
pip3.11 --version
故障排除
如果仍然失败
1.
检查 config.log
cat config.log | grep -A10 -B10 "ssl"
2.
确认库文件路径
# 确保库文件存在
ls -l /usr/lib64/libssl.so.1.1 /usr/lib64/libcrypto.so.1.1
# 确保头文件存在
ls -l /usr/include/openssl11/
3.
更新动态链接库缓存
sudo ldconfig
重要注意事项
1.
不要删除系统 OpenSSL
系统工具(如 yum)依赖 OpenSSL 1.0.2,删除会导致系统故障。
2.
使用 altinstall
始终使用 make altinstall 避免覆盖系统默认 Python。
3.
环境变量持久化
如需永久生效,将环境变量添加到 ~/.bashrc 或 /etc/profile:
echo 'export PATH=/usr/local/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
4.
虚拟环境推荐
避免以 root 用户安装包:
python3.11 -m venv myenv
source myenv/bin/activate
pip install package
总结表格
问题现象 根本原因 解决方案 验证命令
ModuleNotFoundError: _ssl OpenSSL 版本过旧 强制链接到 OpenSSL 1.1.1 python3.11 -c "import ssl"
_hashlib 模块缺失 库链接错误 设置正确的 LDFLAGS python3.11 -c "import hashlib"
SSL 功能不可用 头文件路径错误 设置正确的 CPPFLAGS python3.11 -c "print(ssl.OPENSSL_VERSION)"
通过以上方法,你应该能够成功在 CentOS/RHEL 7 系统上编译安装支持 SSL 的 Python 3.11。记得根据实际情况选择最适合的方法,推荐使用方法一,因为它最安全且不会影响系统稳定性。
2万+

被折叠的 条评论
为什么被折叠?



