You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python3.6源码编译后无法导入ssl模块:ModuleNotFoundError问题求助

解决Python 3.6源码编译后无法导入_ssl模块的问题

我帮你捋捋这个问题——你遇到的ModuleNotFoundError: No module named '_ssl',本质上是Python编译时没正确链接到你新装的OpenSSL 1.1.1预发布版,或者运行时找不到对应的动态库。下面分步骤排查和解决:

先确认OpenSSL的实际安装状态

首先你得确认OpenSSL 1.1.1真的装到了/usr/local/ssl路径下,执行以下命令验证:

# 检查库文件是否存在
ls -l /usr/local/ssl/lib/libssl.so /usr/local/ssl/lib/libcrypto.so
# 检查头文件是否存在
ls -l /usr/local/ssl/include/openssl

如果这些文件都存在,说明OpenSSL安装没问题,问题出在Python的编译环节。

核心问题:修改Setup.dist后未正确重新编译Python

你修改了Python-3.6.5/Modules/Setup.dist里的ssl配置,但如果只是改了文件却没重新完整编译Python,或者编译时没让编译器找到新的OpenSSL路径,那修改等于白做。按以下步骤重新编译:

1. 清理之前的编译残留

进入你的Python源码目录,先把之前编译的文件清干净:

cd Python-3.6.5
make clean
make distclean

2. 设置环境变量,让编译器找到新的OpenSSL

在执行./configure前,必须告诉编译器新OpenSSL的头文件和库文件位置,执行以下命令:

export CFLAGS="-I/usr/local/ssl/include"
export LDFLAGS="-L/usr/local/ssl/lib"
export LD_LIBRARY_PATH="/usr/local/ssl/lib:$LD_LIBRARY_PATH"

3. 重新配置、编译并安装Python

执行configure(如果之前你指定了安装前缀,比如--prefix=/usr/local/python3.6,记得加上):

./configure --prefix=/usr/local/python3.6

然后编译安装:

make
sudo make install

额外处理:运行时动态库找不到的问题

就算编译成功了,系统默认可能还是找不到/usr/local/ssl/lib下的动态库,导致运行时依然报错。解决方法:

临时生效(重启后失效)

执行:

export LD_LIBRARY_PATH="/usr/local/ssl/lib:$LD_LIBRARY_PATH"

永久生效

创建一个动态库配置文件:

sudo echo "/usr/local/ssl/lib" > /etc/ld.so.conf.d/openssl-1.1.1.conf

然后更新动态库缓存:

sudo ldconfig

验证结果

打开Python交互环境,测试ssl模块:

import ssl
print(ssl.OPENSSL_VERSION)

如果输出显示OpenSSL 1.1.1开头的版本号,就说明问题解决了。

内容的提问来源于stack exchange,提问作者user9371654

火山引擎 最新活动