在centos7上安装python3.7,很多时候提示缺少安装_ssl模块,这导致很多依赖于ssl的模块无法正常安装,如ulib3,requests。
百度网上也提供很多方法,诸如安装liber.ssl来解决。经过一番探索后,个人总结如下:
(1)、python3.7的_ssl模块依赖openssl 1.0.2或者1.1以上版本,如果openssl版本低于以上版本,将无法正常安装python3.7 的ssl模块,提示:Python requires an OpenSSL 1.0.2 or 1.1 compatible libssl with X509_VERIFY_PARAM_set1_host().
解决方法:
1、通过yum update 方式更新openssl。这种方式优点是实现简单,缺点是前提需要配置公网yum源,通过公网yum源来实现更新,对于无网络的服务器来说比较麻烦。
2、通过下载源码进行编译。这种方式比较适合于内网,也不会有依赖问题。
(a)、官网下载:https://www.openssl.org/source/
(b)、解压后执行编译安装:./config --prefix=/opt/openssl-1.0.2q/ --openssldir=/opt/openssl-1.0.2q/openssl && make && make install
(2)、python3.7的_sshl模块需要调用ssl.h函数头,如果操作系统缺少安装openssl-devel软件包,如果是通过yum或者rpm包安装方式的,则需要安装或者更新openssl-devel软件包。如果是通过源码编译实现的,则在源码编译安装时已提供了,无需再安装。
(3)、openssl的路径设置,这个很重要。
1、在python3.7的configure源码安装中,在configure文件需要指定openssl的路径,即配置with-openssl(即./configure --prefix=/opt/python-3.7.1 --with-openssl=/opt/openssl-1.0.2q),这样python的configure就可以正常读取openssl的准确版本了。如果不配置则读取的可能是未更新的openssl版本。
2、如果是通过yum或者rpm安装openssl的,则通过rpm -qa |grep openssl或者软件包名后,执行rpm -ql openssl软件包名获取openssl的路径,最后通过指令ln软连接实现。我是通过如下指令实现的:ln -s /usr/include/openssl /usr/local/ssl 实现。(个人在测试的时候,发现python编译安装时候,一直读取的ssldirs是"/usr/local/ssl /usr/lib/ssl /usr/ssl /usr/pkg /usr/local /usr",即使配置了with-openssl,如果没有配置PKG_CONFIG等环境变量,仍然会读取默认的配置,因此需要将openssl的路径通过连接方式链接到/usr/local/ssl目录下)。当满足以上配置后,在python3.7执行./configure --prefix=/opt/python-3.7.1,即可在configure阶段就可以看到libssl的支持。例如: