从源码编译安装python3.6之后,用pip的时候可能会提示SSL错误,实际上是openssl和python的安装有问题,本文给出安装openssl和python3.6.6的完整过程。
1、编译安装openssl
首先说明在python3.6编译的时候没有 --with-ssl 这个参数,python3.6.6源码中setup.py中有下面几行:
# Detect SSL support for the socket module (via _ssl)
search_for_ssl_incs_in = [
'/usr/local/ssl/include',
'/usr/contrib/ssl/include/'
]
ssl_incs = find_file('openssl/ssl.h', inc_dirs,
search_for_ssl_incs_in
)
这说明了编译的时候会在/usr/local/ssl的子路经中寻找ssl的头文件,所以使用参数--prefix将openssl安装在/usr/local/ssl即可。
(1) 首先解压文件,然后进入openssl源码目录,按下面的命令进行编译安装
./config --prefix=/usr/local/ssl
sudo make
sudo make install
(2)添加动态链接库路径
打开文件 /etc/ld.so.conf
在文件末尾添加ssl动态链接库的路径 /usr/local/ssl/lib
sudo ldconfig
ldconfig -p | grep libssl.so.3 # 查看动态链接库是否存在
2、编译安装python3.6.6
(1) 编译安装
在python源码目录中执行下面的命令
sudo ./configure --prefix=/opt/python3.6.6
sudo make
sudo make install
安装结束后将 /opt/python3.6.6/bin下的python3.6和pip3.6软链到/usr/bin即可。
(2)安装验证
执行 sudo pip3.6 install onnx 测试pip是否正常,如果出现下面的错误,尝试执行下面第(3)步的文件修改,并重新编译安装。
Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)':
(3) 解压并进入源码目录
修改文件 Modules/Setup,将下面所示的4行注释去掉(第209到212行)。网上有的文章说还需要修改Setup.dist,实际上我只修改了Setup,目前使用场景下没有出现问题。
207 # Socket module helper for SSL support; you must comment out the other
208 # socket line above, and possibly edit the SSL variable:
209 SSL=/usr/local/ssl
210 _ssl _ssl.c \
211 -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
212 -L$(SSL)/lib -lssl -lcrypto
有任何问题欢迎留言交流。