在我使用pip安装Python包时,报错如下:
Could not fetch URL https://pypi.org/simple/pymysql/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/praw/ (Caused by SSLError(SSLError(136, '[X509] no certificate or crl found (_ssl.c:4232)'))) - skipping
ERROR: Could not find a version that satisfies the requirement pymysql (from versions: none)
ERROR: No matching distribution found for praw
这报错意思是无法连接SSL,但是我Deepin上面确实自带有openSSL,但是没有openssl-dev组件。那就麻烦了,如果是Ubuntu和CentOS可以直接安装,但是Deepin不行,得自己编译安装openSSL!
来吧,用Linux的人还怕折腾么!
一、编译OpenSSL
1.1、编译
因为Deepin系统缺少openssl-dev组件,我们需要先卸载自带的openssl然后自己编译openssl(自行去官网下载源码)。
注意,如果你系统已经使用了一段时间,此时卸载openSSL包,apt会要求你必须将依赖到此组件的程序包全部卸载才行,我的Google Chrome、Pycharm等等全部遭殃,后面要重装了!
sudo apt autoremove openssl
# 先进入解压后的目录
./Configure --prefix=/usr/local/ssl --openssldir=/usr/local/ssl '-Wl,-rpath,$(LIBRPATH)'
make -j12 # 此处核心数看你自己电脑实际情况
sudo make install
1.2、创建软链接
接着需要创建软链接,不然Python编译时会报错libssl.so.3: cannot open shared object file: No such file or directory
sudo ln -s /usr/local/ssl/lib/libssl.so.3 /usr/lib/libssl.so.3
sudo ln -s /usr/local/ssl/lib/libcrypto.so.3 /usr/lib/libcrypto.so.3
二、Python编译
此次编译使用的Python是最新的3.9.4版,请自行在官网下载源码并解压。注意Setup这个文件,只有在python完成安装后才会生成这个文件,也可以跳过此步在第一次编译安装时直接使用--with-openssl=/usr/local/ssl
选项。
2.1、修改Models配置
在Models目录找到setup.dist文件,取消以下几行的注释,取消后Python就可以启用SSL。
_socket socketmodule.c
SSL=/usr/local/ssl
_ssl _ssl.c \
-DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
-L$(SSL)/lib -lssl -lcrypto
2.2、编译Python
./configure --enable-optimizations --prefix=/usr/local/python3.9.4/
# sudo make clean 如果是第一次编译就不用,如果是编译后报错需要先清理再重新编译
make -j12
sudo make altinstall # 如果直接install会覆盖原来的版本,altinstall表示共存```