centos7上编译Python3.9.19

CentOS 7 是 2014 年的系统,默认库太老,Python 3.9 很容易出现这种情况大概率是gcc/openssl版本太低导致的。

1.GCC版本太老

CentOS7 默认:gcc 4.8.5

而 Python 3.9 官方建议:
gcc >= 7

GCC 4.8 在某些优化阶段(特别是 PGO)会产生异常。

解决办法,从scl源安装gcc11

yum install centos-release-scl -y
yum install devtoolset-11 -y
scl enable devtoolset-11 bash

检查:

gcc -v

应该是:

gcc 11.x

2.OpenSSL 版本过低

CentOS7 默认:

openssl 1.0.2

Python 3.9 推荐:

openssl >= 1.1.1

否则很多模块会异常。

检查:

openssl version

如果是:

OpenSSL 1.0.2k

建议编译新版本。


3.编译依赖缺失

Python 编译必须的依赖:

yum install -y \
gcc gcc-c++ make \
zlib-devel \
bzip2-devel \
libffi-devel \
openssl-devel \
readline-devel \
sqlite-devel \
xz-devel \
tk-devel \
gdbm-devel

4.Python3.9 编译流程

1
2
3
4
5
cd /usr/local/src

wget https://www.python.org/ftp/python/3.9.19/Python-3.9.19.tgz
tar xf Python-3.9.19.tgz
cd Python-3.9.19

配置:

./configure \
--prefix=/local/base/python3.9 \
--enable-optimizations \
--with-ensurepip=install

# or
./configure --prefix=/usr/local/python3.9 --enable-optimizations --enable-shared
make -j$(nproc)
make install

编译:

make -j$(nproc)
make install

4.1配置ld

1
export LD_LIBRARY_PATH=/usr/local/python3.9/lib:$LD_LIBRARY_PATH

然后再测试:

1
2
/usr/local/python3.9/bin/python3.9 -V
/usr/local/python3.9/bin/pip3 -V

如果可以显示版本,就可以临时使用了。

方法一:把库路径加入 /etc/ld.so.conf.d/python3.9.conf

1
2
echo "/usr/local/python3.9/lib" > /etc/ld.so.conf.d/python3.9.conf
ldconfig

然后:

1
2
python3.9 -V
pip3 -V

方法二(如果 prefer 静态或不改系统):

编译 Python 时使用 --enable-shared,然后配置 LD_LIBRARY_PATH,你的 Python3.9 很可能就是共享库编译的,但系统没找到路径。