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




