问题
在openssl版本较低的机器上安装python3.7.9后,执行命令pip3 install -i https://pypi.douban.com/simple/ requests
或者代码中涉及到https请求时,会报ssl相关错误,以下是开发的程序运行后的报错信息:
Traceback (most recent call last):
File "/apps/usr/python3/lib/python3.7/site-packages/flask/app.py", line 2447, in wsgi_app
response = self.full_dispatch_request()
File "/apps/usr/python3/lib/python3.7/site-packages/flask/app.py", line 1952, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/apps/usr/python3/lib/python3.7/site-packages/flask_cors/extension.py", line 165, in wrapped_function
return cors_after_request(app.make_response(f(*args, **kwargs)))
File "/apps/usr/python3/lib/python3.7/site-packages/flask/app.py", line 1821, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/apps/usr/python3/lib/python3.7/site-packages/flask/_compat.py", line 39, in reraise
raise value
File "/apps/usr/python3/lib/python3.7/site-packages/flask/app.py", line 1950, in full_dispatch_request
rv = self.dispatch_request()
File "/apps/usr/python3/lib/python3.7/site-packages/flask/app.py", line 1936, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "SingleApiServer.py", line 255, in wangyi
list = wangyiSpider()
File "SingleApiServer.py", line 169, in wangyiSpider
r = requests.get(url, headers=headers)
File "/apps/usr/python3/lib/python3.7/site-packages/requests/api.py", line 76, in get
return request('get', url, params=params, **kwargs)
File "/apps/usr/python3/lib/python3.7/site-packages/requests/api.py", line 61, in request
return session.request(method=method, url=url, **kwargs)
File "/apps/usr/python3/lib/python3.7/site-packages/requests/sessions.py", line 530, in request
resp = self.send(prep, **send_kwargs)
File "/apps/usr/python3/lib/python3.7/site-packages/requests/sessions.py", line 643, in send
r = adapter.send(request, **kwargs)
File "/apps/usr/python3/lib/python3.7/site-packages/requests/adapters.py", line 514, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: HTTPSConnectionPool(host='news.163.com', port=443): Max retries exceeded with url: /rank/ (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available."))
看最后的输出,大概率是和openssl的问题,百度一波后,整理下正确的安装姿势。
升级openssl
上面的错误,就是因为openssl的版本和python3.7.9不兼容导致的,所以需要先升级下openssl版本。
$ yum -y install wget zlib-devel bzip2-devel openssl-devel \
ncurses-devel sqlite-devel readline-devel \
tk-devel gdbm-devel db4-devel libpcap-devel \
xz-devel libffi-devel
# 此版本经过验证没有问题,其他版本不保证,没试过
$ wget https://github.com/openssl/openssl/archive/OpenSSL_1_1_1d.tar.gz -O /tmp/OpenSSL_1_1_1d.tar.gz
$ cd /tmp/ && tar zxf OpenSSL_1_1_1d.tar.gz -C .
$ cd openssl-OpenSSL_1_1_1d/
$ ./config --prefix=/apps/usr/openssl_1_1_1d
$ make && make install
$ mv /usr/bin/openssl{,_$(date +%F_%H%M).bak}
$ ln -sf /apps/usr/openssl_1_1_1d/bin/openssl /usr/bin/openssl
$ echo '/apps/usr/openssl_1_1_1d/lib' >> /etc/ld.so.conf
$ ldconfig -v
$ openssl version # 确认版本无误
OpenSSL 1.1.1d 10 Sep 2019
安装Python
# 必须保证系统字符集为utf-8,否则需要配置以下环境变量(不配置的话,会编译报错)
$ cat >> /etc/profile << EOF
export LANG=zh_CN.UTF-8
export LANGUAGE=zh_CN.UTF-8
EOF
$ source /etc/profile
# 开始安装python
$ wget https://mirror.bjtu.edu.cn/python/3.7.9/Python-3.7.9.tgz -O /tmp/Python-3.7.9.tgz
$ cd /tmp/ && tar zxf Python-3.7.9.tgz -C .
$ cd Python-3.7.9/
$ vim Modules/Setup.dist # 修改源码文件,指定openssl安装目录(下面显示了行号211-214行,需要取消这些行的注释符号)
211 SSL=/apps/usr/openssl_1_1_1d # 指定openssl安装目录,取消注释符号后,保存退出即可
212 _ssl _ssl.c \
213 -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
214 -L$(SSL)/lib -lssl -lcrypto
$ ./configure prefix=/apps/usr/Python-3.7.9
$ make && make install
$ cat >> /etc/profile << EOF
PATH=/apps/usr/Python-3.7.9/bin:\$PATH
EOF
$ source /etc/profile
$ python3 -V # 确定版本
Python 3.7.9
修改pip源
$ cat >> /etc/pip.conf << EOF
[global]
index-url = https://mirrors.aliyun.com/pypi/simple/
EOF
安装requests模块验证
如果此模块可以安装成功,那么运行python程序,也不会报文章开头的错误。
$ python3.7 -m pip install --upgrade pip
$ pip3 install requests