Python - ImportError: No module named ‘_ssl‘问题

问题背景

操作系统Centos7.7,内核版本 3.10.0-1062
安装python3.6成功后,在python脚本中import ssl标准库报错:

>>> import ssl
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/PythonDir/lib/ssl.py", line 98, in <module>
    import _ssl             # if we can't import it, let the error propagate
ModuleNotFoundError: No module named '_ssl'
>>>

检查python安装过程中的信息,通过搜索“_ssl”关键字发现有failed:
在这里插入图片描述

问题分析

在python源码的setup.py文件,搜索到错误提示抛出位于方法check_extension_import中:
在这里插入图片描述
查看调用位置位于build_extensions()方法中:
在这里插入图片描述
上图脚本中self.extensions变量值来自该方法中的如下两处:
在这里插入图片描述
猜测openssl版本或者安装路径可能不符合要求,python3.6需要openssl 1.0.2以上。
根据以上追踪,猜测原因1:ssl在disableed_module_list中或使用了缓存配置不编译_ssl;
猜测原因2:外网有人反映将python3安编译装到usr/local之外的地方会导致该ssl模块安装失败,该机制尚不清楚,需要进一步排查。

解决方法

针对原因1

找到一个帖子解决方法步骤很详细,完全可以参考:https://techglimpse.com/install-python-openssl-support-tutorial/

Setp1,确认openssl版本:

[root@node]# openssl version
OpenSSL 1.0.2k-fips  26 Jan 2017

Step2,最好使用从python3.6.x.tar.gz新解压的包,这样python源码里面不会存留有build缓存文件;
python3 默认使用在Modules/Setup文件中配置的SSL路径:
在这里插入图片描述
将默认配置解除注释:

# Socket module helper for SSL support; you must comment out the other
# socket line above, and possibly edit the SSL variable:
SSL=/usr/local/ssl
_ssl _ssl.c \
   -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
   -L$(SSL)/lib -lssl -lcrypto

如果该路径没有安装ssl工具,请自行安装openssl, openssl-dev
yum install openssl
yum install openssl-devel -y
安装完成后再次使用命令openssl version查看openssl版本以确认安装成功。

Step3,重新安装python,命令行依次执行:

./configure --prefix=/usr/local/python3
make && make install

针对原因2

编译脚本代码量较大,机制尚未完全搞清楚需要些时间,经过在不同操作系统尝试,python3安编译装到usr/local之外的地方也能成功,编译安装过程中使用到了usr/bin,usr/local的资源,要确保环境变量path包括这些路径。

参考资料

[1]. https://blog.csdn.net/qq_42346414/article/details/90649217?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0.pc_relevant_aa&spm=1001.2101.3001.4242.1&utm_relevant_index=3
[2]. https://stackoverflow.com/questions/5937337/building-python-with-ssl-support-in-non-standard-location

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值