解决python3.7中使用requests库报错:“Can‘t connect to HTTPS URL because the SSL module is not available.“

 场景:

在python3.7中使用requests库提交post请求时报错如下:

requests.exceptions.SSLError: HTTPSConnectionPool(host='xxx.xxx.com.cn', port=443): Max retries exceeded with url: /artifactory/ui/auth/login?_spring_security_remember_me=false (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available."))

 原因:

从官网下载了Python3.7.4,直接编译安装后,使用pip3出现了报错信息: Can't connect to HTTPS URL because the SSL module is not available。

在Python3.7之后的版本,依赖的openssl,必须要是1.1或者1.0.2之后的版本,或者安装了2.6.4之后的libressl。

而本地的openssl依然是1.0.1e的。

[root@localhost ~]# openssl version
OpenSSL 1.0.1e-fips 11 Feb 2013

 解决方法

下载新版本openssl

上openssl官网https://www.openssl.org/source/下载1.0.2或者1.1之后的openssl包,编译安装。我选择的是1.0.2r。

[root@localhost ~]# wget http://www.openssl.org/source/openssl-1.0.2r.tar.gz
[root@localhost ~]# tar zxvf openssl-1.0.2r.tar.gz
[root@localhost ~]# ./config --prefix=/opt/openssl1.0.2r --openssldir=/opt/openssl1.0.2r/openssl no-zlib
[root@localhost ~]# make && make install
[root@localhost ~]# echo "/opt/openssl1.0.2r/lib" >> /etc/ld.so.conf
[root@localhost ~]# ldconfig -v

注意:编译openssl1.0.2r的时候建议加上no-zlib,否则后面可能会出现undefined symbol: SSL_CTX_get0_param错误。

重新安装python3.7

下载Python包,编译

[root@localhost ~]# wget https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tar.xz
[root@localhost ~]# tar xvf  Python-3.7.4.tar.xz
[root@localhost ~]# cd Python-3.7.4
[root@localhost ~]# ./configure --prefix=/data/tools/Python3.7.4 --enable-shared CFLAGS=-fPIC --with-openssl=/opt/openssl1.0.2r

 注:这里加上--enable-shared和-fPIC之后可以将python3的动态链接库编译出来,默认情况编译完lib下面只有python3.xm.a这样的文件,python本身可以正常使用,但是如果编译第三方库需要python接口的比如caffe等,则会报错;所以这里建议按照上面的方式配置。

如果openssl不使用系统yum安装的,而是使用自己编译的比较新的版本可以使用--with-openssl=/usr/local/openssl这种方式指定,后面目录为openssl实际安装的目录,另外编译完还要将openssl的lib目录加入ld运行时目录中即可。

编译完成后不要make,先修改Python源码包中ssl的参数

打开源码解压目录中的 Modules/Setup ,直接搜索 SSL= ,将SSL=后面的目录改为前面openssl的安装目录,并把下面三行的注释去掉。

[root@localhost ~]# vim Modules/Setup
SSL=/opt/openssl1.0.2r
_ssl _ssl.c \
    -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
    -L$(SSL)/lib -lssl -lcrypto

改完之后就在解压目录直接make就行了。

[root@localhost ~]# make && make install
[root@localhost ~]# echo "export PATH=/data/tools/Python3.7.4/bin:$PATH" >> ~/.bashrc
[root@localhost ~]# source ~/.bashrc
[root@localhost ~]# pip3 list
Package  Version
---------- -------
pip    19.0.3 
setuptools 40.8.0 
You are using pip version 19.0.3, however version 19.2.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

将python库路径添加到/etc/ld.so.conf配置中

echo "/data/tools/Python3.7.4/lib" >> /etc/ld.so.conf
vim /etc/ld.so.conf.d/python3.conf
## 将/data/tools/Python3.7.4/lib写入/etc/ld.so.conf.d/python3.conf

执行ldconfig生效,这样在接下来运行python3是就不会报找不到库文件的错误了。

ldconfig

源码安装Python参考:

https://blog.csdn.net/m0_46829545/article/details/127441097

猜你喜欢

转载自blog.csdn.net/m0_46829545/article/details/132285989