避坑-编译安装 Python 时遇到无法构建 SSL
共 4126字,需浏览 9分钟
·
2024-05-27 07:00
然有了 docker,为啥还需要编译安装 Python 呢,是不是自找麻烦。 docker 是方便,但是如果机器本身就自带 Python 最新版本,作为一个开发环境,岂不更方便?
笔者编译安装过不下 10 次,每次还是被这个错误浪费不少时间,今天就总结一下,让你在编译安装 Python 的过程中避坑。
步骤 1: 安装依赖
在编译 Python 之前,你需要确保你的系统安装了所有必须的构建依赖。在基于 Debian 的系统上,像 Ubuntu 这样的,可以这样做:
sudo apt update
sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev \
libnss3-dev libssl-dev libsqlite3-dev libreadline-dev libffi-dev libbz2-dev
对于基于 Red Hat 的系统,比如 CentOS 或者 Fedora,可以这样做:
sudo yum groupinstall "Development Tools"
sudo yum install zlib-devel bzip2-devel openssl-devel ncurses-devel \
sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel
步骤 2: 下载 Python 源码
可以从 Python 官方网站或其在 GitHub 的镜像库下载源码。使用 wget
从官方源下载的命令:
wget https://www.python.org/ftp/python/3.12.3/Python-3.12.3.tgz
然后解压下载的文件:
tar -xvzf Python-3.12.3.tgz
解压后,切换到源码目录:
cd Python-3.12.3
步骤 3: 配置编译选项
在编译之前,配置安装选项,可以使用 ./configure
脚本。可以指定诸如安装目录的选项(通过 --prefix
参数)和编译优化(在 Python 3.12,通过 --enable-optimizations
开启编译优化可能会显著提升 Python 性能但是会使编译过程更长)。
./configure --enable-optimizations --prefix=/usr/local/python3.12
这里,我们将 Python 安装到 /usr/local/python3.12,然后手动添加 Path,这样不会影响其他版本的 Python,比如 python2.
还有许多其他的配置选项,可以通过运行 ./configure --help
来查看它们。
步骤 4: 编译 Python
运行 make
命令来编译 Python:
make -j 8 # '8' 是编译时使用的核心数,根据你的系统调整
由于编译时间较长,我们可以使用 -j
选项会在编译时进行并行处理,以加快编译速度。这个数字最好设置为你的处理器核心数。
到这里,我们通常会遇到 ssl 报错:
Could not build the ssl module!
Python requires a OpenSSL 1.1.1 or newer
而操作系统上的 openssl 通常都是低于 1.1.1 的,遇到这种情况,就 openssl 官网下载新版本,编译安装,然后把相关的库收集到安装路径的 lib 目录即可。但是安装 openssl 通常也不是那么顺利的。根据以下步骤进行
mkdir ~/openssl
cd ~/openssl
wget https://www.openssl.org/source/openssl-3.3.0.tar.gz
tar -zxvf openssl-3.3.0.tar.gz
cd openssl-3.3.0
./config --prefix=/usr/local/ssl3.3 --openssldir=/usr/local/ssl3.3 shared zlib
make
make install
如果上述步骤在 config 步骤报错:Can't locate IPC/Cmd.pm in @INC ,则需要安装下面的依赖包:
sudo yum groupinstall 'Development Tools'
sudo yum install perl-core zlib-devel
上述的步骤将 openssl 安装在 /usr/local/ssl3.3 下面,我们可以在命令行(terminal)执行 /usr/local/ssl3.3/bin/openss version
如果执行报错,则需要指定 lib64 的路径 :
sudo vim sudo vim /etc/ld.so.conf.d/openssl.conf
# 加入内容 /usr/local/ssl3.3/lib64
sudo ldconfig
然后在执行 /usr/local/ssl3.3/bin/openss version
即可看到正确的版本信息。
但是编译 Python 之前,还有一个关键的步骤,就是需要在 /usr/local/ssl3.3/ 下创建一个 lib 文件,然后将相应的 so 文件放进去,通过执行下面的命令:
cd ~/openssl/openssl-3.3.0 # 确保再解压的目录中
mkdir /usr/local/ssl3.3/lib
cp ./*.{so,so.3*,a,pc} /usr/local/ssl3.3/lib
步骤 5: 再次配置、编译 Python
运行 make
命令来编译 Python:
./configure --with-openssl=/usr/local/ssl3.3 --prefix=/usr/local/python3.12
make -j 8 # '8' 是编译时使用的核心数,根据你的系统调整
这次就可以顺利完成编译了。
步骤 6: 安装 Python
一旦编译完成,运行以下命令以安装 Python:
sudo make install
我们不需要使用 altinstall
是因为我们指定了自己的安装目录 /usr/local/python3.12
。如果不指定安装目录,为了避免替换掉系统的默认 Python 版本,可以使用 altinstall
。
步骤 6: 验证安装
安装完成后,可以通过调用新安装的 Python 版本来检查它:
/usr/local/bin/python3.12 --version
输出应该显示 Python 的版本号。进入 Python 后,执行 import ssl 验证安装。
$ /usr/local/python3.12/bin/python3
Python 3.12.3 (main, May 23 2024, 15:08:26) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import ssl
>>> ssl.OPENSSL_VERSION
'OpenSSL 3.3.0 9 Apr 2024'
>>>
至此完成安装。
参考链接
https://stackoverflow.com/questions/53543477/building-python-3-7-1-ssl-module-failed
以上以上,如有帮助欢迎点赞关注转发,遇到问题也可以联系微信 somenzz-enjoy。