Ubuntu/CentOS源码编译安装Python 3.7详细步骤
在生产服务器中,系统预装的 Python 版本往往承担着底层运维工具(如 CentOS 的 YUM 或 Ubuntu 的系统组件)的运转,不可随意升级替换。当业务或旧版项目必须运行在 Python 3.7 环境下时,最稳健的方案是通过官方源码编译独立安装。本文将分别针对 Ubuntu(Debian 系)与 CentOS(RHEL 系)发行版,系统介绍从系统依赖安装、源码获取、编译优化到安全安装及后续环境验证的完整实操流程。
第一步:安装系统编译工具与必要依赖库
源码编译并非只调用 GCC 生成可执行文件即可。Python 内部诸如 pip 网络通信、文件压缩、动态库桥接以及本地数据库等模块,均依赖宿主系统的 C 语言头文件和静态/动态库支持。如果在执行编译配置之前缺失这些依赖包,编译过程不会中断,但会静默跳过对应的 C 扩展模块,最终导致生成的 Python 无法使用 SSL 或报 ModuleNotFoundError: No module named '_ctypes' 错误。
1. Ubuntu 环境依赖安装
打开终端,首先更新本地包列表索引,随后安装构建基础套件及相关的头文件支持:
sudo apt-get update
sudo apt-get install -y build-essential checkinstall \
libreadline-gplv2-dev libncursesw5-dev libssl-dev \
libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev \
libffi-dev zlib1g-dev wget curl
2. CentOS 环境依赖安装
在 CentOS 7 或 8 环境下,通过 yum 安装开发工具组和对应的依赖库包:
sudo yum groupinstall -y "Development Tools"
sudo yum install -y openssl-devel bzip2-devel libffi-devel \
zlib-devel readline-devel sqlite-devel wget curl \
xz-devel gdbm-devel tk-devel
ctypes),因此 libffi-dev(Ubuntu)或 libffi-devel(CentOS)成为编译前必须满足的硬性依赖,缺少它将导致后期安装 pip 时抛出找不到 _ctypes 异常。
第二步:获取并解压 Python 3.7 官方源码
源码应从 Python 官方镜像源下载。Python 3.7 分支最后的维护版本为 3.7.17。建议将源码归档下载到系统的临时目录(如 /usr/src 或当前用户的家目录):
cd /usr/src
sudo wget https://www.python.org/ftp/python/3.7.17/Python-3.7.17.tgz
sudo tar -zxvf Python-3.7.17.tgz
cd Python-3.7.17
执行 tar -zxvf 解包完成后,进入解压出的目录,可以看到包含 configure 脚本、Makefile.pre.in 以及 C 源码文件在内的完整构建树。
第三步:生成 Makefile 配置文件
执行编译前,必须运行 ./configure 检查当前系统的编译环境与头文件路径,并生成对应的 Makefile。
./configure --enable-optimizations --prefix=/usr/local
关键参数说明:
-
--prefix=/usr/local:指定编译产物的安装根目录。二进制可执行文件将放置在/usr/local/bin,类库将位于/usr/local/lib。这符合 Linux 文件系统分层规范(FHS),不会与系统在/usr/bin下的基础组件冲突。 -
--enable-optimizations:开启基于 Profile Guided Optimization(PGO)的性能分析优化。编译器会先构建一个临时解释器,执行一系列标准测试收集常用指令分支,然后二次编译生成高度优化的最终二进制文件,使执行效率提升约 10%~20%。
第四步:编译与执行安全安装
配置完成后,开始执行 C 代码的多核编译,并在编译完成后将其安装至系统目录。
1. 启动编译过程
make -j $(nproc)
nproc 命令会自动获取当前系统的 CPU 核心数,例如 4 核服务器即等效于 make -j 4。多线程并行编译可以显著缩短构建耗时。若配置了 --enable-optimizations,编译过程会执行 Python 自带的单元测试,耗时通常在 5 到 15 分钟左右,终端会持续输出测试信息,请耐心等待其完成。
2. 执行安装:牢记使用 make altinstall
编译完成后,必须使用管理员权限将文件复制到目标目录:
sudo make altinstall
make install!必须使用 make altinstall。如果在多版本共存的 Linux 系统中执行
make install,构建脚本会自动建立 /usr/local/bin/python3 甚至 python 软链接,导致系统原生的 Python 3 解释器被覆盖,进而直接破坏依赖特定版本的系统级工具(例如 Ubuntu 系统的图形控制组件、CentOS 系统的 yum / dnf 包管理器)。
第五步:结果验证与模块完整性测试
安装完成后,可直接在终端中验证 Python 3.7 的可执行路径及核心扩展支持:
1. 检查版本与路径
python3.7 --version
which python3.7
pip3.7 --version
示例输出:
Python 3.7.17
/usr/local/bin/python3.7
pip 23.0.1 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)
2. 核心 C 扩展模块可用性检查
运行如下单行指令,确认 ssl(网络连接)、ctypes(动态库连接)和 sqlite3 模块均已被正确编译:
python3.7 -c "import ssl; import ctypes; import sqlite3; print('All core modules compiled successfully!')"
若输出 All core modules compiled successfully!,说明本次源码编译非常完整,所有底层关键模块均已无缝链接。
第六步:使用 venv 搭建项目独立环境
尽管 pip3.7 已经可用,但在 Linux 生产环境中,直接向全局 site-packages 安装第三方库容易造成版本混乱。标准做法是使用内置的 venv 模块为每个项目划分独立环境:
# 1. 创建项目目录并进入
mkdir ~/my_project && cd ~/my_project
# 2. 基于 Python 3.7 创建虚拟环境
python3.7 -m venv venv_py37
# 3. 激活虚拟环境
source venv_py37/bin/activate
# 4. 在虚拟环境中验证解释器指向
which python
python -V
激活后,命令提示符前缀会出现 (venv_py37),此时执行 pip install 仅会将包安装到 ~/my_project/venv_py37/lib/python3.7/site-packages 下,与系统其余环境完全隔离。当项目运行结束,输入 deactivate 即可退出虚拟环境。
第七步:常见编译故障排查与修复方案
1. ModuleNotFoundError: No module named '_ctypes'
现象:在执行 make altinstall 的最后阶段,系统在安装 pip 时报错终止,提示 ModuleNotFoundError: No module named '_ctypes'。
原因:编译前未安装 libffi 的开发头文件。
解决方法:补装依赖后重新配置并编译:
# Ubuntu 执行:
sudo apt-get install -y libffi-dev
# CentOS 执行:
sudo yum install -y libffi-devel
# 随后重新执行编译与安装:
cd /usr/src/Python-3.7.17
./configure --enable-optimizations --prefix=/usr/local
make -j $(nproc)
sudo make altinstall
2. pip is configured with locations that require TLS/SSL
现象:使用 pip3.7 install 安装任何第三方模块时,提示 pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.。
原因:系统缺失 OpenSSL 开发库,导致 Python 源码在构建时未编译出 _ssl.so 模块。
解决方法:
# Ubuntu:
sudo apt-get install -y libssl-dev
# CentOS:
sudo yum install -y openssl-devel
# 重新编译安装 Python:
./configure --enable-optimizations --prefix=/usr/local
make -j $(nproc)
sudo make altinstall
3. 编译过程中进程被 Kill(内存耗尽)
现象:编译执行到一半时,终端出现 Killed 或 g++: internal compiler error: Killed (program cc1plus) 并异常退出。
原因:在 1GB 或 2GB 内存的小型云服务器上,开启 --enable-optimizations 并使用过多核心(如 make -j 4)并发编译时,编译器消耗内存超过物理内存上限,触发了 Linux 系统的 OOM Killer 机制。
解决方法:为服务器临时增加 2GB 的虚拟内存(Swap 文件),并将并发数调为单核(make -j 1):
# 临时创建 2GB 交换分区
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
# 单线程重新编译
make -j 1
sudo make altinstall
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









