避坑-编译安装 Python 时遇到无法构建 SSL

Python七号

共 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 202415: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。

浏览 30
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报