不能也不该升级系统自带python 2.7,必须用make altinstall源码编译安装python 3.9.18并保留双版本共存;因yum等工具硬编码依赖/usr/bin/python指向python 2.7,覆盖将导致syntaxerror或importerror,系统瘫痪。

不能也不该“升级”系统自带的 Python 2.7,只能安全安装 Python 3.9 并保持双版本共存。 CentOS 7 的 yum、firewalld、urlgrabber-ext-down 等核心工具硬编码依赖 /usr/bin/python 指向 Python 2.7;一旦覆盖或重指向,立即报 SyntaxError: invalid syntax 或 ImportError: No module named site,系统包管理即瘫痪。
为什么必须用 make altinstall 而不是 make install
make install 会生成 /usr/local/bin/python 和 /usr/local/bin/pip,与系统原有 /usr/bin/python 冲突风险高,且极易被 PATH 优先调用导致意外;make altinstall 则只生成带完整版本号的二进制:python3.9 和 pip3.9,完全不触碰 python、python3、pip 这些无版本号命令,是唯一可回退、可验证的安全方式。
- 执行后检查:
ls /usr/local/bin/python*应只看到python3.9(可能还有python3,但绝不能有python) -
ls /usr/bin/python*应仍为python → python2,python2、python3均存在且可用 - 若误运行
make install,需手动清理/usr/local/bin/python*中无版本号的文件
configure 必加的三个参数缺一不可
漏掉任一参数,后续 pip 无法联网、SSL 请求失败、C 扩展(如 numpy)编译报错或运行时报 ModuleNotFoundError: No module named '_ctypes':
-
--enable-shared:生成libpython3.9.so.1.0,否则扩展模块链接失败 -
--with-ensurepip=install:内置 pip3.9,避免后续手动装get-pip.py因缺 ssl 模块而卡死 -
--prefix=/usr/local:标准路径,确保/usr/local/bin在默认 PATH 中;不要用/opt/python39等自定义路径
推荐完整命令:./configure --enable-optimizations --enable-shared --with-ensurepip=install --prefix=/usr/local --with-ssl
共享库加载失败:error while loading shared libraries: libpython3.9.so.1.0
这不是环境变量问题,LD_LIBRARY_PATH 临时设置既不安全也不持久。真实原因是动态链接器未扫描 /usr/local/lib:
- 新建配置:
echo "/usr/local/lib" | sudo tee /etc/ld.so.conf.d/python3.9.conf - 刷新缓存:
sudo ldconfig - 验证是否生效:
ldconfig -p | grep python3.9应输出对应 so 文件路径 - 若仍报错,检查
/usr/local/lib下是否存在libpython3.9.so.1.0;不存在说明 configure 时漏了--enable-shared
想让 python 命令默认调用 Python 3.9?先改三处脚本 shebang
仅当明确需要覆盖 /usr/bin/python 时才操作,且必须前置完成以下修改,否则 yum 立即崩溃:
-
/usr/bin/yum第一行改为:#!/usr/bin/python2 -
/usr/libexec/urlgrabber-ext-down第一行改为:#!/usr/bin/python2 -
/usr/bin/firewall-cmd、/usr/sbin/firewalld等所有以#!/usr/bin/python开头的脚本,统一替换为#!/usr/bin/python2 - 确认
python2命令存在(yum install python2补装),再执行:sudo rm -f /usr/bin/python && sudo ln -s /usr/local/bin/python3.9 /usr/bin/python
真正容易被忽略的是:即使做完全部步骤,/usr/bin/python 指向 Python 3.9 后,任何未显式指定 python2 的第三方 RPM 包安装脚本仍可能失败——这不是配置问题,而是设计限制。生产环境强烈建议保留 python → python2 不变,新项目统一用 python3.9 显式调用。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











