解决pip3安装依赖时SSL问题

踩了个巨坑

今天开始学习 PyTorch,在安装环境的时候,需要用到 pip3 安装 PyTorch
本来是一件很简单的事,一条命令就可以搞定,没想到碰到了如下报错

1
WARNING: Retrying (Retry(total=0, 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.")': /whl/cu90/torch/

意思是说因为 SSL 错误导致安装无法进行下去,没办法,只好开始Google之旅,找了中文的英文的解决方法,要么是复制粘贴的,要么是无法解决的,最后花了几个小时,终于解决了,于是写一篇踩坑记录记录下来

原因

之所以会碰到 PyTorch 安装失败,有几个原因

  • OpenSSL 版本过低,Linux自带的版本是1.0.1的版本,需要至少1.1.1的版本
  • Python 版本,需要在3.8-3.11之间
  • 未正确将SSL编译进Python

解决方法

如果不是必要,保留 Linux 自带的 OpenSSL,否则可能出现各种依赖问题
首先要编译 OpenSSL,下载 OpenSSL 安装包,并解压,进入解压后的目录内

1
2
3
wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz
tar -xvzf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w

编译并安装

1
2
./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl no-zlib
make install

编辑 /etc/ld.so.conf 文件

1
2
echo "/usr/local/ssl/lib" >> /etc/ld.so.conf
ldconfig -v

重命名原来的OpenSSL文件

1
mv -f /usr/bin/openssl /usr/bin/openssl.old

修改软链,指向新版本的OpenSSL路径

1
ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl

可以测试一下是否安装成功

1
openssl version

重新编译 Python,如果要安装 PyTorch,Python 的版本要在3.8-3.11之间
下载源码包,并解压缩,进入解压后的目录

1
2
3
wget https://www.python.org/ftp/python/3.8.18/Python-3.8.18.tar.xz
tar -xvf Python-3.8.18.tar.xz
cd Python-3.8.18

编辑 Modules/Setup 文件(很重要),修改如下配置

1
2
3
4
5
6
7
8
9
# Socket module helper for socket(2)
_socket socketmodule.c # 取消注释

# Socket module helper for SSL support; you must comment out the other
# socket line above, and possibly edit the SSL variable:
SSL=/usr/local/ssl # 修改为编译 OpenSSL 时设置的目录
_ssl _ssl.c \
-DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
-L$(SSL)/lib -lssl -lcrypto

编译 Python

1
2
3
./configure
make
make install

编译 make 之后,输出信息里面可能出现 _ctypes 模块编译失败,这可能会导致后面引入 PyTorch 时出现错误,所以可以安装 libffi-dev 后,重新编译并安装一次

1
apt install libffi-dev

这样就可以愉快的安装 PyTorch 了,注意版本到官网上去找对应的版本

1
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu90

今天真的是踩了个大坑,本来还想从今天开始学习 PyTorch 呢,没想到搭建环境这一关就给我来了个下马威 \(º □ º l|l)/
今天把环境搭建起来了,明天再开始学习 PyTorch,开始准备毕设吧─=≡Σ((( つ><)つ