008 | Linux 上安装 Python:apt / yum / 源码编译
难度:⭐⭐ |预计阅读:10 分钟 |前置:[007 macOS 安装 Python] |下一篇:[009 Python 版本区别]
1. 你为什么要看这篇?
Linux 上安装 Python 比 Windows 和 Mac 复杂——不是因为操作难,而是因为选择多。不同发行版的包管理器不同(apt vs yum vs dnf),同一个发行版又可以源码编译安装。选错方式,轻则版本太旧,重则把系统 Python 搞炸。
这一篇覆盖三种主流 Linux 发行版(Ubuntu / CentOS / Arch)的包管理器安装 + 通用的源码编译安装。读完你可以在任何一台 Linux 服务器上正确地部署 Python。
2. Linux Python 安装全景图
图 2-1:Linux Python 安装决策树。红色 = 决策起点,蓝色 = 两大流派,橙色 = 三种包管理器,绿色 = 源码编译。灰色虚线 = 绝对不能做的事。
3. 前置操作:检查系统自带 Python
# 几乎所有 Linux 发行版都自带 Python 3python3--version# 例如 Ubuntu 24.04 输出:Python 3.12.3whichpython3# 例如输出:/usr/bin/python3# 关键确认:系统 Python 的路径ls-la/usr/bin/python3# 输出中如果有 -> python3.12 这样的符号链接,说明这是系统管理的版本核心原则(再次强调):/usr/bin/python3是系统的,不要删、不要替换、不要用sudo pip install往里装包。你需要做的是在旁边另装一个,或者用虚拟环境隔离。
4. 方案一:包管理器安装(推荐)
4.1 Ubuntu / Debian 系(apt)
# 1. 更新包索引sudoaptupdate# 2. 安装 Python 3.12(及其完整工具链)sudoaptinstallpython3.12 python3.12-venv python3.12-dev python3-pip# 3. 验证python3.12--version# Python 3.12.xpip3.12--version# pip 24.xapt 的版本滞后问题:Ubuntu 22.04 LTS 的默认 apt 源中 Python 最高只到 3.10。如果你需要更新的版本,添加 deadsnakes PPA(Python 官方维护的 Ubuntu 源):
sudoaptupdatesudoaptinstallsoftware-properties-common-ysudoadd-apt-repository ppa:deadsnakes/ppa-ysudoaptupdatesudoaptinstallpython3.12 python3.12-venv python3.12-dev-y术语:PPA(Personal Package Archive)是 Ubuntu 的第三方软件源。deadsnakes 是 CPython 核心开发者维护的非官方 PPA,提供了最新 Python 版本的 apt 包。它虽然叫"dead snakes"(死蛇),但可靠性在社区有共识。
4.2 RHEL / CentOS / Fedora 系(yum / dnf)
# CentOS 7 及更早:用 yumsudoyuminstallpython3.12 python3.12-devel python3-pip-y# CentOS 8+ / Fedora:用 dnfsudodnfinstallpython3.12 python3.12-devel python3-pip-y# 验证python3.12--versionRHEL 系的默认源通常不包含最新 Python。CentOS 7 官方源最高只到 Python 3.6。如果你在 CentOS 7 上需要 3.12,必须源码编译(见第 5 节)。
4.3 Arch / Manjaro(pacman)
# Arch Linux 默认滚动升级,Python 版本通常是最新的sudopacman-Spython python-pip python-virtualenv# 验证python--version# Arch 直接用 python,不是 python3Arch 的哲学是"上游发布什么我就给什么",所以pacman -S python装的通常就是最新稳定版。注意:Arch 上用python而不是python3。
4.4 包管理器安装的目录结构
# 可执行文件位置(以 Ubuntu + deadsnakes 为例)/usr/bin/python3.12# 解释器/usr/bin/pip3.12# pip# pip install 的包安装位置/usr/local/lib/python3.12/dist-packages/# apt 安装的包~/.local/lib/python3.12/site-packages/# pip install --user 安装的包注意到dist-packages和site-packages两个不同的目录名——这是 Debian/Ubuntu 系特有的约定:apt 装到dist-packages,pip 装到site-packages。两者都在 Python 的搜索路径中,但分开管理防止冲突。
5. 方案二:源码编译安装
当包管理器没有你要的版本(如 CentOS 7 需要 Python 3.12),或你需要自定义编译选项(如开启--enable-optimizations),源码编译是最可靠的选择。
5.1 完整编译流程
图 5-1:源码编译流程。红色 = 起始步骤,蓝色 = 前置准备,橙色 = 编译核心步骤,绿色 = 最终安装。注意是
altinstall不是install。
# ====== 第一步:安装编译依赖 ======# Ubuntu / Debiansudoaptupdatesudoaptinstallbuild-essential libssl-dev zlib1g-dev\libbz2-dev libreadline-dev libsqlite3-devcurl\libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev\libffi-dev liblzma-dev-y# CentOS / RHELsudoyum groupinstall"Development Tools"-ysudoyuminstallopenssl-devel bzip2-devel libffi-devel\readline-devel sqlite-devel xz-devel-y# ====== 第二步:下载源码 ======cd/tmpcurl-Ohttps://www.python.org/ftp/python/3.12.7/Python-3.12.7.tar.xztar-xfPython-3.12.7.tar.xzcdPython-3.12.7# ====== 第三步:配置编译选项 ======./configure --enable-optimizations--prefix=/usr/local# --enable-optimizations:开启 PGO(Profile Guided Optimization)# 编译时间增加约 2 倍,但运行时性能提升 10-20%# --prefix=/usr/local: 安装到 /usr/local 而不是覆盖系统 Python# ====== 第四步:编译(-j 后面跟 CPU 核心数)=======make-j$(nproc)# ====== 第五步(可选):运行测试套件 ======maketest# 这一步耗时 5-15 分钟,但能确保编译出的 Python 没有暗病# ====== 第六步:安装 ======sudomakealtinstall# 关键:是 altinstall,不是 install!# install → 覆盖系统的 python3 → 系统可能炸# altinstall → 只安装 python3.12 → 系统 python3 保持原样5.2altinstallvsinstall:为什么这一字之差至关重要
# make install 会做的事(危险):# 创建 /usr/local/bin/python3 符号链接 → 覆盖系统默认行为# make altinstall 会做的事(安全):# 只创建 /usr/local/bin/python3.12 ← 带版本号,不碰 python3 这个别名# 验证whichpython3.12# /usr/local/bin/python3.12python3.12--version# Python 3.12.75.3 卸载源码编译的 Python
# 删除安装的文件sudorm-rf/usr/local/bin/python3.12*sudorm-rf/usr/local/lib/python3.12/sudorm-rf/usr/local/include/python3.12/# 删除源码目录rm-rf/tmp/Python-3.12.76. 踩坑与避坑
坑 1:make install把系统 Python 覆盖了
症状:安装完成后python3指向了你编译的版本,系统工具(如apt、software-properties)开始报 Python 相关的错误。
修复(如果你还没重启终端——立刻执行):
# 恢复系统 Python 的符号链接sudoln-sf/usr/bin/python3.10 /usr/bin/python3# 版本号按实际调整# 或者更根本的:重装系统的 Python 包sudoaptinstall--reinstallpython3防御:永远用sudo make altinstall,养成肌肉记忆。
坑 2:编译时缺少 OpenSSL 导致 pip 无法使用 HTTPS
症状:
python3.12-mpipinstallrequests# 报错:pip is configured with locations that require TLS/SSL,# however the ssl module in Python is not available.原因:编译前没有安装libssl-dev(Ubuntu)或openssl-devel(CentOS)。Python 的ssl模块需要这些头文件才能编译进去。
修复:
# 安装缺失的 SSL 开发库sudoaptinstalllibssl-dev-y# Ubuntu# sudo yum install openssl-devel -y # CentOS# 重新编译安装cd/tmp/Python-3.12.7 ./configure --enable-optimizations--prefix=/usr/localmake-j$(nproc)sudomakealtinstall坑 3:源码编译后python3.12找不到pip
症状:python3.12 -m pip提示No module named pip。
原因:编译时缺少libffi-dev或libbz2-dev,导致ensurepip模块未编译进去。
修复:
# 下载 get-pip.py 手动安装curl-sShttps://bootstrap.pypa.io/get-pip.py|python3.12 pip3.12--version# 验证7. 总结与自测
四个核心结论
- 能用包管理器就不要源码编译——apt/dnf/pacman 安装的 Python 有发行版团队维护,安全更新自动推送。源码编译是你自己负责维护。
- 需要新版本但包管理器没有?Ubuntu 加 deadsnakes PPA,CentOS 老版本源码编译,Arch 直接用
pacman——三种场景三种方案。 altinstall是救命稻草——Makefile 里这个选项保护了系统 Python 不被覆盖。记不住也别记错。- 编译前先把开发库装全——
libssl-dev、libffi-dev、libbz2-dev是三大金刚,缺一个后患无穷。
自测题
Q1:源码编译时,以下哪个命令是正确的安装方式?
- A.
sudo make install - B.
sudo make altinstall - C.
sudo make python3
Q2:Ubuntu 上pip install的包默认装到哪个目录?
- A.
/usr/lib/python3/dist-packages/ - B.
/usr/local/lib/python3.12/dist-packages/或~/.local/lib/python3.12/site-packages/ - C.
/opt/python3/packages/
(答案见文末)
下一篇预告:[009 认识 Python 版本:2.x 与 3.x 的区别]——Python 2 为什么死了?3.10/3.11/3.12/3.13 各自引入了什么?如何选择版本?
自测答案:Q1 → B(altinstall不覆盖系统python3别名) | Q2 → B(apt 装的包在dist-packages,pip 装的默认在site-packages)