ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

CentOS下源码编译安装Python 3.10完整指南

CentOS下源码编译安装Python 3.10完整指南 1. 为什么非要去折腾源码编译CentOS官方源的Python版本现状CentOS的Python版本政策用保守两个字已经不足以形容了。CentOS 7自带的Python是2.7.5这个版本陪伴了服务器圈快十年直到2024年6月Python 2.7才彻底停止安全维护。CentOS 8的默认Python是3.6.8CentOS 8 Stream和Rocky Linux 8等衍生版同样是3.6.x。CentOS 9 Stream的默认版本稍微新一点但也只是3.9.18左右。也就是说你手里的CentOS发行版默认自带Python99%都不是3.10。那能不能用yum直接装3.10答案很残酷官方base源里压根没有python3.10这个包最多给你一个老版本的python3。有些朋友会去装EPEL源但EPEL里往往也只有简洁的python3.x版本号追不上3.10。SCL软件集合倒是能提供更新版本但SCL的生命周期和CentOS是绑定的而且配置、路径习惯跟普通Linux环境很不一样很多新手装上之后连命令都找不到。更麻烦的是SCL本身后来停止了新版本支持你很难指望它长期维护3.10。所以绕了一圈之后源码编译反而成了最通用、最可控、最不依赖第三方仓库的方案。提示如果你是CentOS 7用户其实没必要追求3.10以上的新版本但既然项目要求必须装3.10那源码编译就是最靠谱的路径。本文适合这几类人在CentOS 7/8/9上跑Python项目但发现系统自带版本不满足要求的后端开发需要用Python 3.10的新语法特性结构模式匹配match-case、更精确的类型提示等却不想影响系统其他服务的运维以及纯粹想搞懂Linux源码编译流程的初学者。跟着做完全部步骤你大概能拿到一个独立、干净、不影响系统自带环境、通过python3.10命令直接调用的新解释器。2. 编译前的依赖清单这步偷懒编译完全是坑很多人在编译Python时栽跟头不是栽在make阶段而是栽在依赖缺失。Python 3.10虽然是解释型语言但它的核心运行时有很多底层模块依赖系统库少了任何一个编译过程不会报错但编译出的Python会在后续使用中给你挖各种坑而且这些坑藏得很深。2.1 基础编译工具链安装源码编译Python第一步是装编译工具链。这一步没什么技术含量但很多人真会卡住。CentOS 7的yum源里如果没有groupinstall权限直接用yum install -y gcc make openssl-devel sqlite-devel readline-devel zlib-devel bzip2-devel libffi-devel如果你是CentOS 8/9或者Rocky Linux、AlmaLinux这些使用dnf的发行版把yum换成dnf即可dnf install -y gcc make openssl-devel sqlite-devel readline-devel zlib-devel bzip2-devel libffi-develgcc是C编译器Python解释器底层就是C代码没它寸步难行。make负责执行Makefile里的编译规则。其余那些带-devel后缀的包是开发头文件分别对应Python的多个标准库模块。2.2 SSL、readline、zlib这些库为什么必须装这里要好好解释一下因为这是新手最容易忽略的地方。openssl-devel提供的是SSL/TLS支持Python里的ssl模块、hashlib模块的某些算法、以及通过HTTPS访问网站时用到的urllib、requests底层的加密通信能力全依赖它。如果你没装openssl-devel就编译Pythonconfigure阶段可能不会报错但装完后你执行import ssl会直接报ModuleNotFoundError: No module named _ssl。这意味着你用pip装包时凡是需要访问HTTPS的都会失败而pip从网络下载包走的正是HTTPS。readline-devel负责命令行交互体验。没装它编译出来的Python进入交互式解释器时上下方向键没法调历史命令按Tab也不会补全。严格说这不算致命问题但实际用起来非常难受尤其你习惯用dir()或者敲长命令的时候。zlib-devel是压缩库Python的zlib模块、gzip模块以及pip安装包时的解压缩流程全依赖它。没它的话pip装包会报ModuleNotFoundError: No module named zlib因为Python解析wheel包时要用zlib解压。还有libffi-devel它对应ctypes模块很多第三方包比如某些MySQL驱动、OpenCV需要调用C库函数ctypes缺失会导致这些包安装失败。2.3 能少踩一半坑的依赖检查参考我把常见依赖和对应功能整理成了一张表编译前对照着装一遍。这张表是我之前踩了几次坑后总结的现在每次装新服务器都先过一遍系统库包名对应Python模块缺失后果openssl-develssl, hashlib, urllibpip无法HTTPS下载import ssl报错readline-develreadline交互模式无历史记录、无Tab补全zlib-develzlib, gzippip安装wheel包失败bzip2-develbz2解压.bz2文件报错sqlite-develsqlite3标准库sqlite3模块缺失libffi-develctypes依赖ctypes的第三方库无法导入gcc, make编译本身configure能过但make必失败我第一次在CentOS 7上编译Python 3.9时漏掉了libffi-devel编译倒是顺利走完但ctypes模块始终导入失败后来排查了很久才找到原因。依赖这种东西早花十分钟装齐后面能省一个晚上。3. 下载Python 3.10源码包与编译安装实操依赖装完之后正式开始下载源码和编译。这里用的版本是Python 3.10系列的最新稳定补丁版比如3.10.14。建议不要裸装3.10.0因为早期版本有已知bug直接使用补丁版本更稳妥。3.1 源码包下载与校验Python官方源码包的下载地址是python.org/ftp/python但很多服务器访问海外源速度感人可以用华为云或阿里云的Python镜像源下载速度要快得多。这里以官方路径为例cd /usr/local/src wget https://www.python.org/ftp/python/3.10.14/Python-3.10.14.tgz文件不大大概25MB左右。如果你网络环境对python.org不友好替换成华为云镜像一样的效果wget https://mirrors.huaweicloud.com/python/3.10.14/Python-3.10.14.tgz下载完之后建议做两步校验。第一步解压第二步可以跳过签名验证个人服务器没那么多讲究但至少确认一下文件大小和官方公布的一致避免下载不完整导致后续编译莫名报错。解压tar -zxf Python-3.10.14.tgz cd Python-3.10.143.2 configure参数怎么选进入源码目录后最关键的步骤是configure。这一步会检测当前系统环境、检查依赖库是否齐全、并生成Makefile。我的建议是加上--prefix和--enable-optimizations这两个参数./configure --prefix/usr/local/python310 --enable-optimizations--prefix指定安装目录。默认的安装位置是/usr/local但这会把python3.10相关文件直接散落在/usr/local/bin、/usr/local/lib这些目录里和系统里其他软件混在一起后期想卸载很难清理干净。指定到/usr/local/python310这个独立目录后整个Python 3.10环境都在这一个文件夹里想删直接删目录就行清爽得很。--enable-optimizations会启用PGOProfile-Guided Optimization配置文件引导优化简单理解就是让编译器先收集Python运行时的高频执行路径再针对性地优化一次最终编译出来的解释器性能有5%-10%的提升。代价是编译时间会明显变长。如果你的服务器只有2核CPU这个参数会让make阶段多花大概20分钟左右但生产环境我通常还是建议加上毕竟性能提升是实打实的。如果服务器内存小于1GB建议别用这个参数因为PGO阶段编译器会占用比较多内存小内存机器有OOM风险。这种情况下直接去掉--enable-optimizations就好。3.3 make编译与make install执行编译make -j4-j4表示用4个并行任务编译能显著缩短编译时间。具体数字根据CPU核数调整一般设为CPU核心数的1到2倍。查看CPU核数可以用nproc命令。如果你是2核机器用make -j2。如果内存和CPU都够make -j$(nproc)也不是不行。编译过程中屏幕上会滚动很多信息这时候别急着刷手机多留意有没有Error字样。如果你的依赖装得齐全这一步一般不会报错大概几分钟到十几分钟就编译完了。编译完成之后执行安装make install注意这儿要区分make install和make altinstall。很多教程会让你用altinstall因为altinstall不会覆盖系统自带的python和python3命令。但我们已经把--prefix指定到了/usr/local/python310安装文件都在独立目录里用make install完全没问题不会碰/usr/bin下的系统Python。安装完成后看一下目录结构ls /usr/local/python310/bin/你大概会看到python3.10、pip3.10这些命令。这里的python3.10就是刚安装好的解释器了。4. 安装后必须处理的四个收尾细节编译安装本身不算复杂真正决定使用体验的是收尾配置。很多教程把这里的细节一笔带过导致新手装完发现python3.10命令找不到、pip用不了、SSL报错又得回头猜原因。我按顺序把这四个细节拆开讲。4.1 PATH优先级配置与命令命名安装完成后执行python3.10应该可以直接运行因为/usr/local/python310/bin这个路径对当前shell是默认生效的实际上并不是。make install后程序虽然装好了但系统不会自动把/usr/local/python310/bin加入PATH。你需要手动配置环境变量。编辑/etc/profile在末尾追加export PATH/usr/local/python310/bin:$PATH执行source /etc/profile使配置立即生效。然后验证which python3.10如果能返回/usr/local/python310/bin/python3.10说明PATH配置成功。这里有个很重要的原则export PATH/usr/local/python310/bin:$PATH和export PATH$PATH:/usr/local/python310/bin虽然只差一点点顺序但含义完全不同。前者的新路径在前系统会优先使用新版Python后者系统路径在前会优先使用自带Python。在你确实想用3.10作为默认时务必用前者。4.2 pip版本升级与国内源替换Python 3.10自带pip但默认来源是官方PyPI。在国内服务器上直接pip install requests下载速度通常在几KB到几十KB之间等得人怀疑人生。先升级pip本身python3.10 -m pip install --upgrade pip然后配置国内镜像源。个人推荐清华源或者阿里源mkdir -p ~/.pip cat ~/.pip/pip.conf EOF [global] index-url https://pypi.tuna.tsinghua.edu.cn/simple [install] trusted-host pypi.tuna.tsinghua.edu.cn EOFtrusted-host那个配置在HTTPS证书没问题的情况下其实可以省略但加上能避免某些老环境证书校验失败的情况。配置完再装包试试python3.10 -m pip install requests下载速度通常能到几MB/s体验完全不一样。4.3 SSL模块和压缩模块的验证这一步是我的习惯每次编译完都先验证一遍确认底层模块没丢才能放心使用python3.10 -c import ssl; print(ssl.OPENSSL_VERSION) python3.10 -c import zlib; print(zlib ok) python3.10 -c import ctypes; print(ctypes ok) python3.10 -c import sqlite3; print(sqlite3.sqlite_version)正常输出对应的版本信息就说明一切正常。如果某个模块报ModuleNotFoundError说明编译前对应的*-devel包没装齐需要回到第2节重新安装依赖后重新执行configure、make、make install三部曲。嗯这事我干过不止一次最有效的做法不是打补丁而是装完依赖后重新编译一遍。4.4 最终版本确认做一次完整的最终检查python3.10 --version pip3.10 --version如果输出Python 3.10.14和对应的pip版本号安装就算全部完成。到这里已经可以正常使用了。5. 多版本共存的雷区千万别去碰系统自带的python这一节是我最想强调的。CentOS的软件生态有一个底层依赖yum和dnf都依赖Python。CentOS 7的yum是基于Python 2.7写的它的很多插件、模块都调用了/usr/bin/python。CentOS 8/9的dnf则依赖Python 3.6/3.9。如果你把系统自带的Python换掉哪怕只是替换软链接都可能导致包管理器直接瘫痪。5.1 曾经踩过的坑我第一次在CentOS 7服务器上装Python 3.8时还不太懂这个道理。当时觉得python指向2.7太老了想让它指向新装的Python 3.8于是执行了rm /usr/bin/python ln -s /usr/local/python310/bin/python3.10 /usr/bin/python改完之后python命令确实指向了3.10当时还觉得美滋滋。结果过了几天想装个软件执行yum install vim直接报了一堆ModuleNotFoundError。因为yum内部还在用Python 2.7的语法和模块解释器突然换成3.10后一切全乱了。最后花了一晚上才通过系统救援模式把软链接改回来教训极其深刻。这件事之后我给自己定了一条铁律任何情况下绝不改动/usr/bin/python和/usr/bin/python3的软链接。新版本Python一律放在独立目录通过PATH优先级控制或者直接调用完整路径。5.2 软链接方案的副作用有些教程会建议你执行ln -s /usr/local/python310/bin/python3.10 /usr/bin/python3.10把这个软链接加到/usr/bin下。这个操作本身没什么问题因为它没有覆盖系统原有的python3链接只是增加了一个新的命令入口。但如果你手滑用了-f参数比如ln -sf /usr/local/python310/bin/python3.10 /usr/bin/python3这就危险了。CentOS 8/9里/usr/bin/python3是dnf依赖的入口你一旦把它替换掉dnf大概率会直接崩掉。而且这种问题基本只能进单用户模式或者救援模式修对线上环境来说是灾难级别的故障。5.3 卸载/重装的干净做法如果你哪天不需要Python 3.10了或者想换一个新版本操作非常简单rm -rf /usr/local/python310 sed -i /\/usr\/local\/python310\/bin/d /etc/profile把PATH里的那行配置删掉装好的Python就不存在了。整个卸载过程需要恢复source /etc/profile然后执行which python3.10确认。因为所有文件都没写到系统目录里整个过程非常干净不会遗留乱七八糟的依赖。提示删除了/usr/local/python310之后已经用pip install装进这个环境的第三方包也会一起消失。如果有想保留的包列表卸载之前先执行pip3.10 freeze requirements.txt传出来。6. 用虚拟环境收尾让python3.10成为新项目默认选择编译安装完成、PATH配好之后Python 3.10已经可用了。但如果你一上来就直接全局pip install各种包用不了多久环境就会乱成一锅粥。不同项目的依赖互相冲突、版本互相覆盖这是Python开发最常见的灾难现场。6.1 venv 与 virtualenv 的选择Python 3.10原生自带venv模块不需要额外安装mkdir -p /opt/projects/demo cd /opt/projects/demo python3.10 -m venv venv创建完成后激活它source venv/bin/activate激活后命令行前面会出现(venv)的标识此时命令行的python会指向虚拟环境里的解释器which python输出应该是/opt/projects/demo/venv/bin/python。在这个环境里你安装的所有包都只存在于venv目录下和系统环境完全隔离。退出用deactivate。有些老教程会推荐virtualenv那是Python 2时代的事了。Python 3.10的venv已经能完成99%的隔离需求没必要装额外的工具。6.2 常用操作速记操作命令创建虚拟环境python3.10 -m venv venv激活虚拟环境source venv/bin/activate退出虚拟环境deactivate查看已装包pip list导出依赖清单pip freeze requirements.txt按清单安装依赖pip install -r requirements.txt6.3 环境默认选择的建议如果你在服务器上主要是跑Python项目我建议养成一个习惯每个项目都创建自己的虚拟环境然后把项目的systemd服务或Shell启动脚本里的python路径直接指向这个虚拟环境内部的python比如/opt/projects/demo/venv/bin/python app.py。这么做的好处是即使你全局Python版本换掉或者PATH被改乱项目本身的运行环境都不受影响。还有一个细节以后新建项目时可以提前在shell里加一个别名比如alias py310/usr/local/python310/bin/python3.10这样每次创建环境只需要敲py310 -m venv venv不用打一长串路径。我个人在实际操作中体会最深的其实不是安装本身而是隔离意识。刚学Linux的时候总喜欢把Python装到系统目录里直接替换系统默认版本后来发现每次升级都心惊胆战生怕把系统搞坏。自从把新版本Python全部放到独立目录、配合虚拟环境使用之后心态完全不一样了——系统Python是系统自己的项目Python是项目的二者井水不犯河水。最后顺手检查一下python3.10 -c import this确认解释器工作正常这套环境就算彻底落地了。
返回列表