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 | cd /usr/local/src |
配置:
./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 | /usr/local/python3.9/bin/python3.9 -V |
如果可以显示版本,就可以临时使用了。
方法一:把库路径加入 /etc/ld.so.conf.d/python3.9.conf
1 | echo "/usr/local/python3.9/lib" > /etc/ld.so.conf.d/python3.9.conf |
然后:
1 | python3.9 -V |
方法二(如果 prefer 静态或不改系统):
编译 Python 时使用 --enable-shared,然后配置 LD_LIBRARY_PATH,你的 Python3.9 很可能就是共享库编译的,但系统没找到路径。