CentOS8编译安装Python3.12并保留2.7:一条命令不踩坑,老脚本继续跑
CentOS8编译安装Python3.12并保留2.7

系统自带的Python2.7一删,yum直接罢工;手动rpm包装Python3.12,版本又老得掉牙。想两手抓,只能源码编译。下面这份笔记把坑全部踩平,照着敲,半小时就能让两个版本和平共处。
为什么一定要保留2.7
CentOS8里,yum、firewall-cmd、authconfig这些老工具硬编码写死了/usr/bin/python。一旦你把系统默认指向改成3.x,开机脚本直接报错,SELinux跟着抽风。保险做法:系统默认不动,新程序显式调用python3.12。
编译前的系统体检
1. 确认gcc、make在不在:which gcc没返回就dnf groupinstall "Development Tools" -y。
把缺掉的库一次性补齐,省得编译到一半报错:dnf install openssl-devel bzip2-devel libffi-devel zlib-devel readline-devel sqlite-devel xz-devel -y。

给/usr/local单独划一个卷更好,没条件也无所谓,记得别把--prefix写进系统目录,防止以后rm -rf误伤。
下载、解压、校验一条龙
去官网扒最新稳定tarball,wget断点续传省流量:
wget -c https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tgz
顺带把.sig文件拉下来,gpg --verify Python-3.12.0.tgz.asc,提示“Good signature”再往下走,别嫌麻烦,被篡改的源码分分钟给你埋后门。
编译参数这样写,后期最省心

解压后先进目录,再新建一个build文件夹,外置编译干净:
mkdir ../py312-build && cd ../py312-build
配置命令:
../Python-3.12.0/configure --prefix=/usr/local/python3.12 --enable-optimizations --with-ensurepip=install --enable-shared LDFLAGS="-Wl,-rpath /usr/local/python3.12/lib"
重点解释:
--enable-optimizations跑一遍PGO,性能提升一成左右,编译时间翻倍,服务器空载就开着;
--enable-shared把libpython3.12.so弄出来,以后给mod_wsgi、uwsgi这类动态加载用;
rpath直接写死库搜索路径,省得你再去/etc/ld.so.conf.d里加文件。
make & install 避坑指南
先make -j$(nproc),CPU有多少核就飙多少,十来分钟完事。接着别急着install,跑测试:
make -j$(nproc) test
看到“Tests result: SUCCESS”再make altinstall。注意,必须是altinstall,它会生成python3.12、pip3.12,不会覆盖系统自带的/usr/bin/python。
把命令扔进$PATH,随用随调
CentOS8用/etc/profile.d最干净:
echo 'export PATH="/usr/local/python3.12/bin:$PATH"' > /etc/profile.d/python3.12.sh && chmod +x /etc/profile.d/python3.12.sh
重新登录,python3.12 -V能吐出“Python 3.12.0”就算成功。老脚本开头写#!/usr/bin/python2,继续跑,谁也不碍谁。
pip换国内源,下载嗖嗖的
mkdir -p ~/.pip && cat > ~/.pip/pip.conf < [global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple trusted-host = pypi.tuna.tsinghua.edu.cn EOF
以后pip3.12 install模块,速度从十几K拉到几兆。
多版本并存,venv是最佳搭档
新项目别直接装全局包:
python3.12 -m venv /opt/proj/venv
激活后pip想装啥装啥,系统目录保持处女状态。要跑定时任务,在crontab里先source venv/bin/activate,再执行脚本,一条命令解决依赖地狱。
常见报错速查表
1. “No module named '_ctypes'”:漏装libffi-devel,装完重新configure。
“can not load libpython3.12.so”:忘了--enable-shared,或者rpath没写,ldconfig也救不了,只能重编。
“SSL module not available”:openssl-devel版本太老,dnf update下再重来。
卸载也优雅,别直接删目录
真有一天想回退,进入当初build目录:
make uninstall
会把/usr/local/python3.12清得干干净净,再把profile.d里的sh文件删掉,系统瞬间回到最初模样。
装依赖→下载源码→configure带优化→make altinstall→写PATH→用venv隔离。照着敲,CentOS8就能稳稳当当同时抱住Python2.7与3.12两条大腿。
