
1. 为什么在 CentOS 7 上装 Python 总是让人抓狂如果你跟 CentOS 7 打过几年交道一定会遇到这种场景项目要求 Python 3.8系统自带的却是 2.7.5。想用 yum 装个高版本对不起官方源里根本没有。去编译源码configure、make、make install 一套流程走下来稍不留神就装进了 /usr/local/bin跟系统自带的 Python 纠缠在一起pip 装包要么提示权限不足要么把系统依赖给搞坏了。说到底问题出在 CentOS 7 的定位上。它的生命周期很长系统服务和运维工具全部绑定在 Python 2.7 上这种绑定是操作系统层面的yum 本身就跑在 Python 2 上。如果贸然把系统默认 Python 换成 3.x极有可能导致系统工具异常。但开发环境又必须用新版 Python这时候就需要一个“隔离 版本切换”的工具Pyenv 就是干这个事的。Pyenv 的原理其实不复杂它本质上是一堆 shell 脚本通过修改 PATH 环境变量来改变当前终端里python命令指向的路径。你安装的所有 Python 版本都放在~/.pyenv/versions/目录下每个版本独立存在互不影响。切换版本只需要改一下 PATH 的搜索顺序不存在对系统目录的侵入安全系数高得多。另外一个常见的疑问是为什么不直接用虚拟环境我个人的经验是虚拟环境工具比如 virtualenv、venv解决的是“同一个 Python 解释器下多个项目依赖隔离”的问题而 Pyenv 解决的是“系统里共存在多个 Python 解释器版本”的问题。两者根本不是同一个维度。更准确地说Pyenv 负责装解释器、切解释器虚拟环境负责在某个解释器下隔离第三方包。实际项目里往往两个都要用。这篇文章会把我在 CentOS 7 上用 Pyenv 安装任意 Python 版本的完整流程、坑点坑因、生产环境落地的注意事项一次性讲清楚。内容基于我实际踩过一遍的教训整理不是那种复制粘贴的官方文档照着做应该能让你省下大半天时间。2. 安装前的必要准备依赖库和编译环境2.1 为什么必须先装编译依赖Pyenv 的一大特性是它默认不会去下载官方编译好的二进制包而是从源码编译 Python。所以问题就来了编译 Python 需要一堆底层依赖比如 OpenSSL、zlib、readline、sqlite3 等。这些不是 Python 自己内置的东西它们以动态库的形式存在于操作系统中Python 编译的时候要能找到对应的头文件和库文件。我在最开始用 Pyenv 的时候犯过一个非常经典的错误直接跳过依赖安装上来就pyenv install 3.8.5结果编译到一半报了一个ModuleNotFoundError: No module named _ssl当时觉得莫名其妙。后来才明白这是缺少 OpenSSL 开发包导致的。如果你在编译阶段没有把依赖装齐Python 虽然也能装上但编译出来的解释器是个“残废版”ssl模块、zlib模块、readline模块统统不可用最直接的体验就是pip install走 HTTPS 源会失败pip装的时候提示 SSL 证书错误。所以第一步必须是装依赖而且是越全越好。下面这条命令基本是我在 CentOS 7 上装 Pyenv 之前的固定动作sudo yum install -y gcc gcc-c make patch \ zlib-devel bzip2-devel readline-devel sqlite-devel \ openssl-devel libffi-devel ncurses-devel \ tk-devel gdbm-devel xz-devel有两点需要特别说明。第一libffi-devel非常重要。从 Python 3.7 开始标准库里的ctypes模块需要 libffi 库的支持没有它ctypes导入就会报错而很多第三方库比如一部分框架的 C 扩展在安装时会自动调用 ctypes到时候报错你根本想不起来源头在哪。第二如果你的机器要装 Python 3.10 及以上版本建议额外确认 OpenSSL 的版本不低于 1.1.1因为高版本 Python 对 TLS 协议的支持要求更高老旧的 OpenSSL 1.0.2 会在ssl模块编译时出现各种奇怪问题。2.2 升级 OpenSSL 的特殊处理这里必须专门展开说一下 OpenSSL。CentOS 7 自带的 OpenSSL 版本停留在 1.0.2k这是一个非常老旧的版本它不支持 TLS 1.3而且对很多新密码套件的支持也不完整。如果你只打算装 Python 3.6 或 3.7那问题不大凑合用问题不明显。但一旦你尝试安装 Python 3.10、3.11、3.12编译的时候大概率会遇到ssl模块相关的报错或者编译能过但运行时ssl.OPENSSL_VERSION显示的还是老版本。一套比较可靠的流程是先通过源码编译升级 OpenSSL 到 1.1.1 或更高然后确保编译 Python 时能链接到新版本的 OpenSSL。但这一步对新手来说比较劝退因为它涉及到动态库搜索路径的修改容易把系统搞乱而且系统 yum 工具本身依赖 OpenSSL如果升级时头文件路径没配对后续 yum 都可能出问题。我的建议是分场景处理。如果你只是个人开发环境、本地测试机直接用 Pyenv 官方提供的PYTHON_CONFIGURE_OPTS配合openssl路径的方式就可以。大致流程如下# 下载并编译 openssl-1.1.1安装到独立目录不干扰系统 openssl wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz tar xzf openssl-1.1.1w.tar.gz cd openssl-1.1.1w ./config --prefix/usr/local/openssl --openssldir/usr/local/openssl shared make -j$(nproc) sudo make install # 编译 Python 时指定使用新版 openssl export LDFLAGS-L/usr/local/openssl/lib -Wl,-rpath,/usr/local/openssl/lib export CPPFLAGS-I/usr/local/openssl/include -I/usr/local/openssl/include/openssl export CONFIGURE_OPTS--with-openssl/usr/local/openssl注意这里用了CONFIGURE_OPTS这是 Pyenv 读取的配置变量。设置完之后再执行pyenv install 3.11.4编译出的 Python 就会优先链接到你新编译的 OpenSSL。这个方法是经过我多台机器验证的唯一不足是编译时间会长一些但稳定性有保障。2.3 安装 Git 与 Pyenv 本体Pyenv 官方推荐通过 Git 仓库克隆的方式来安装而不是下载 zip 包。为什么因为 Pyenv 更新很频繁尤其是 Python 新版本发布后如果你想第一时间用 Pyenv 安装就得拉取最新的版本数据库。Git clone 方式天然支持后续git pull更新。安装过程三步走# 第一步安装 git sudo yum install -y git # 第二步克隆 pyenv 仓库到用户的 .pyenv 目录 git clone https://github.com/xxx/pyenv.git ~/.pyenv # 第三步配置 shell 环境变量 echo export PYENV_ROOT$HOME/.pyenv ~/.bashrc echo export PATH$PYENV_ROOT/bin:$PATH ~/.bashrc echo eval $(pyenv init --path) ~/.bashrc echo eval $(pyenv init -) ~/.bashrc # 重新加载 shell 配置 source ~/.bashrc这里有一个细节Pyenv 官方文档里对pyenv init的写法有几种变体不同版本要求不一样。在较新的 Pyenv 版本中pyenv init --path和pyenv init -两者都建议写入.bashrc。前者负责把~/.pyenv/versions下的bin目录注入 PATH后者负责实现 shell 的自动补全和pyenv shell这类交互功能。如果漏掉第二个通常也不会影响基本使用但会出现某些功能不可用的情况所以建议两条都写上。装完之后验证一下pyenv --version能输出版本号就说明本体已经装好了。这里再补充一个建议如果在公司内网或网络受限环境GitHub 克隆失败可以找一个可用的镜像仓库替换上面的地址或者用代理策略但注意 CentOS 7 的 curl 版本较老对 HTTPS 证书的校验偶尔会抽风遇到问题再处理。3. 核心操作安装指定 Python 版本3.1 先搞清楚可用版本列表Pyenv 怎么知道当前有哪些 Python 版本可以安装它的机制是内置了一个版本数据库文件记录了所有官方发行版本的下载地址、版本号、checksum。当我们执行下面命令时看到的就是这份数据库pyenv install --list输出会非常长因为它涵盖了 CPython、PyPy、Anaconda、Miniconda 等一大堆发行版。普通用户关注的是以数字开头的项比如3.8.18、3.10.12、3.11.6等这些是标准的 CPython 版本。如果在列表里看不到你想要的版本执行一次pyenv update这个命令会拉取最新的版本数据库把 Pyenv 升级到支持最新 Python 的版本。注意有些 Linux 发行版通过包管理器安装的 Pyenv 没有pyenv update子命令但通过 Git 方式安装的通常都有。3.2 安装过程的完整解析和报错排查当你确定要安装的版本后执行安装命令pyenv install -v 3.10.12-v参数是 verbose 模式把编译日志打印到终端。第一次安装时建议加上它因为一旦编译失败你能看到具体卡在哪一步。完整安装过程大概是下载源码包 → 解压 → 执行 configure → 执行 make → 安装到~/.pyenv/versions/3.10.12/。整个编译过程耗时取决于机器性能。4 核 8 线程的机器编一个 3.10 大概需要 5 到 10 分钟2 核小机器可能要煎熬半小时。如果想加速可以在.bashrc或当前终端里设置export MAKE_OPTS-j$(nproc)Pyenv 会把这个参数传给 make实现多线程并行编译。但要注意如果你的机器内存很小低于 2GB并行编译可能导致内存不足而报错这种情况下老老实实单线程编译更稳妥。编译过程中最常见的几个报错我列在下面报错现象根本原因解决办法No module named _ssl缺少 OpenSSL 开发头文件或 OpenSSL 版本过老安装openssl-devel或按上文升级 OpenSSL 并指定CONFIGURE_OPTSNo module named _bz2缺少 bzip2 开发包yum install bzip2-develNo module named _curses缺少 ncurses 开发包yum install ncurses-develERROR: The Python ssl extension was not compiledOpenSSL 路径未正确指定设置CONFIGURE_OPTS--with-openssl...后重装zipimport.ZipImportError: cant decompress datazlib 开发包缺失yum install zlib-develgcc: internal compiler error: Killed内存不足导致编译进程被系统杀掉减小并行度export MAKE_OPTS-j2或直接不加注意这些报错即使编译通过了也可能以“隐性问题”存在也就是说某些模块编译失败时Python 的构建脚本有时并不终止整个编译过程而是把失败的模块静默跳过。所以安装完成之后最好执行一次功能自检python3 -c import ssl, zlib, bz2, lzma, sqlite3, curses, ctypes; print(ok)没有报错才算真正装干净了。3.3 版本切换的三种模式装好之后Pyenv 提供三种不同的版本切换模式适应不同场景。第一种是全局模式pyenv global 3.10.12这个命令会把默认版本切到 3.10.12后续所有 shell 会话中python命令都指向该版本。适合一台机器主要就干一种活的情况。第二种是本地模式pyenv local 3.10.12这个命令会在当前目录生成一个.python-version文件里面写着3.10.12。Pyenv 检测到当前目录有这个文件就会自动切换到对应版本。子目录同样生效。这种方式适合为不同项目指定不同的 Python 版本比如 A 项目要用 3.8B 项目要用 3.11在各自的项目根目录执行一次pyenv local即可。我强烈建议日常用这种方式因为它把版本信息跟项目绑定在一起换机器、换同事协作时只要代码仓库里包含.python-version文件大家自动就用同一个版本省去了口头沟通的麻烦。第三种是临时模式pyenv shell 3.10.12它只在当前 shell 会话内生效关闭终端就失效。适合临时跑个脚本、做个小实验时临时切版本。需要注意优先级pyenv shell的命令行设置 pyenv local的目录级文件 pyenv global的默认配置。如果你发现明明设置了 local 但 python 版本不对首先检查是否当前 shell 已经被设置为某个其他版本。切换之后验证版本pyenv versions这个命令会列出所有已安装的版本并在当前生效版本前加个星号。再看一眼python -V确认实际生效的版本号。4. 高频踩坑现场CentOS 7 特有的疑难杂症4.1 编译过程中 GCC 版本过老的问题CentOS 7 自带的 GCC 版本是 4.8.5这个版本发布于 2015 年已经很老了。Python 3.8 以上的版本部分源码在编译时可能触发老版本 GCC 的兼容性问题。最常见的表现是编译过程中出现一堆warning有些是正常的但有些会直接导致 configure 阶段的特性测试失败最终结果是编译出来的 Python 某些高级特性被静默关闭。如果你遇到这种情况建议安装 Developer Toolset 提供的更高版本 GCC。CentOS 7 上可以通过 Software CollectionsSCL来安装新版本 GCC。大致流程sudo yum install -y centos-release-scl sudo yum install -y devtoolset-8-gcc devtoolset-8-gcc-c # 启用新版 gcc scl enable devtoolset-8 bash启用后执行gcc --version确认版本已经是 8.x。再执行 Pyenv 安装命令编译时就会使用新版 GCC。这个坑属于“不遇到还好一遇到就卡半天”的类型建议生产环境安装前直接提前装好省得到时候返工。4.2 下载源码包失败和网络问题Pyenv 默认从 Python 官方 FTP 服务器下载源码包网络不好的时候下载速度堪称灾难甚至直接就超时中断。我遇到过的典型报错是curl: (56) Recv failure: Connection reset by peer这种情况一般是网络层面的问题。解决办法有两个方向。一个是为 Pyenv 指定国内可用的镜像源通过环境变量控制下载地址指向镜像服务器。具体做法是在.bashrc里配置export PYTHON_BUILD_MIRROR_URLhttps://mirrors.example.com/python-release/另一个更通用的方案是自己手动下载好源码包放到~/.pyenv/cache/目录下。Pyenv 每次安装前会先检查这个缓存目录如果找到了对应版本号的压缩包就直接用本地文件不再联网下载。这个方法在网络不稳定时尤其救命。具体做法是先从一个可靠源下载 Python-3.x.x.tar.xz放到缓存目录再执行pyenv install它会优先使用缓存。4.3 PATH 顺序导致的版本错乱Pyenv 的版本切换逻辑是往 PATH 的最前面插入~/.pyenv/versions/版本号/bin这样当你在终端输入python时shell 按照 PATH 从左到右搜索命中 Pyenv 的版本后就停止搜索。听起来很完美但有一个前提eval $(pyenv init --path)必须在 shell 配置文件的合适位置被执行。最常见的坑是你在~/.bashrc里同时使用了多个环境管理工具比如 Python 官方安装包自动写入的 PATH 配置、Anaconda 的初始化脚本它们都会修改 PATH。如果这些配置的顺序出现在 Pyenv 的初始化代码之前那么python命令找到的可能不是 Pyenv 的版本。排查方式很简单echo $PATH | tr : \n | head -10检查输出的第一行是不是~/.pyenv/versions/xxx/bin。如果不是说明 Pyenv 的初始化代码没生效或者顺序不对。把三条 Pyenv 的配置行挪到.bashrc的最后通常是有效的解法。另外注意CentOS 7 默认/etc/profile中的bashrc调用逻辑和普通发行版略有不同改完配置后建议彻底退出终端重新登录而不是只在当前终端source ~/.bashrc。4.4 安装成功后python命令还是找不到有时候你明明执行了pyenv install 3.9.18而且命令成功返回但输入python3却提示命令不存在。这个问题的直接原因是 Pyenv 只管理已经注册的版本。安装完成后如果你没有执行pyenv global或pyenv local来指定版本Pyenv 的 PATH 里就不会出现该版本的 bin 目录。也就是说pyenv install完成之后它只是把版本“装进仓库”并没有“激活”它。解决办法pyenv versions # 确认版本在列表里 pyenv global 3.9.18 # 激活 python3 -V这个操作对新用户来说容易忽略建议把pyenv global当成安装流程的最后一步固定动作。5. 在 Pyenv 之上构建隔离的虚拟环境5.1 Pyenv-virtualenv 插件的价值单独使用 Pyenv 可以管理多个 Python 解释器版本但每个解释器下的第三方包是共用的。打个比方你给项目 A 装了一堆包项目 B 也可能引用到这些包时间一长包之间的版本冲突会把项目折腾得不成样子。这时候就需要 Pyenv 的官方插件 pyenv-virtualenv。它把 Python 官方虚拟环境和 Pyenv 的版本管理结合在一起。安装方式同样通过 Gitgit clone https://github.com/xxx/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv echo eval $(pyenv virtualenv-init -) ~/.bashrc source ~/.bashrc创建虚拟环境pyenv virtualenv 3.10.12 myproject创建完成后用pyenv local myproject把当前目录绑定到这个虚拟环境。此时输入python -V看到的是 3.10.12pip list看到的是干净的初始环境。之后所有依赖都装在这个环境里互不打扰。5.2 结合 pip 依赖管理的实战组合实际项目中我推荐一套组合拳Pyenv 管理解释器版本pyenv-virtualenv 管理虚拟环境项目内用requirements.txt或pyproject.toml锁定依赖。一个典型的项目初始化流程# 1. 创建虚拟环境并激活 pyenv virtualenv 3.10.12 myproject pyenv local myproject # 2. 确认版本和 pip 都是虚拟环境内的 which python which pip # 3. 安装依赖并导出锁文件 pip install -r requirements-dev.txt pip freeze requirements.lock这里有另外一个容易踩的坑如果你在虚拟环境里用了pip freeze它会导出虚拟环境内所有包以及各自的依赖数量非常多这些是准确的。但要小心不要用pip list --formatfreeze之类的替代命令结果是一样的只是格式略不同。另外如果项目里同时包含开发依赖和部署依赖建议分两个文件管理别合并否则部署环境会装上一堆用不到的包。5.3 删除与重建虚拟环境的正确姿势虚拟环境这个东西非常容易攒灰尘。项目迭代一段时间后你可能发现环境里包已经乱到不可救药这时候与其逐个卸载包不如直接销毁重建。命令很简单pyenv virtualenv-delete myproject注意执行删除命令前要确保当前 shell 不在该环境内否则会提示环境正在使用。如果确实在当前目录可以先pyenv local system切回系统环境再执行删除。重建的流程和创建一样如果项目里有完整的锁文件重建很快这也反向证明了一开始维护锁文件的价值。6. Pyenv 日常维护和几个加速技巧6.1 定期更新 Pyenv 与 Python 构建工具Pyenv 本身迭代很快老版本可能导致某些新 Python 版本无法安装。建议每月执行一次pyenv update这会同时更新 Pyenv 主仓库和已安装的插件。更新之后记得重新登录一下 shell确保新的初始化代码被加载。在 CentOS 7 上尤其要注意更新后如果发现pyenv命令报一些奇怪的语法错误多半是系统默认 Python 2.7 与 Pyenv 新版本脚本的兼容性问题。这种情况我遇到过一两次最简单的解决办法是用系统 bash 重新加载配置并重启终端还是不行的话检查~/.pyenv目录是否有异常的文件权限。6.2 使用缓存加速多台机器部署如果你有多台 CentOS 7 机器都需要同样的 Python 版本完全可以让它们共用源码包缓存。方法就是把~/.pyenv/cache目录里的.tar.xz文件拷贝到其他机器相同目录。这样部署新机器时可以完全离线安装某个 Python 版本不依赖外网。具体操作# 在有缓存的机器上打包缓存目录 tar czf pyenv-cache.tar.gz ~/.pyenv/cache/ # 在目标机器上解压到 ~/.pyenv/cache/ mkdir -p ~/.pyenv/cache tar xzf pyenv-cache.tar.gz -C ~/.pyenv/还有一个更贴近日常的技巧手动用 wget 下载源码包到 cache 目录后可以顺手记一下 checksum 是否和 Pyenv 期望的一致。如果 checksum 不匹配Pyenv 会拒绝使用本地缓存然后重新联网下载。校验方法md5sum ~/.pyenv/cache/Python-3.10.12.tar.xz正常情况下下载自官方源的包不会校验失败。只有通过非官方渠道下载时可能出现文件损坏或版本不对的情况。6.3 让 Pyenv 与系统 Python 和平共处有些运维脚本或系统工具比如 yum 本身依赖系统自带的 Python 2.7。Pyenv 默认不会干扰这些因为你没有把 Pyenv 的 bin 目录放在系统服务的 PATH 中。但有几个容易忽略的越界行为需要提醒。第一不要用 Pyenv 的 Python 去覆盖/usr/bin/python或/usr/bin/python2.7的符号链接。有些教程会让你这样操作来“让系统默认 Python 变成新版”这是非常危险的做法轻则 yum 失灵重则系统管理工具全部出错。第二确保系统服务和 cron 任务中执行的 python 命令使用的是绝对路径/usr/bin/python而不是裸命令python。因为 cron 的环境变量和交互式 shell 不同它可能不加载~/.bashrc一旦某个 cron 脚本需要 Python它找到的可能是系统的 2.7。如果你希望 cron 脚本使用 Pyenv 的版本在脚本里手动 source 环境变量即可#!/bin/bash export PYENV_ROOT$HOME/.pyenv export PATH$PYENV_ROOT/bin:$PATH eval $(pyenv init --path) eval $(pyenv init -) pyenv global 3.10.12 python /path/to/script.py第三注意 CentOS 7 上系统自带的pip是 Python 2.7 捆绑的版本不要用它来装任何包工作环境里所有 pip 操作都应在 Pyenv 激活的 shell 中执行。7. 生产环境实践一套可复用的安装脚本最后分享一个我在多台 CentOS 7 机器上反复使用的安装脚本。它把前面所有步骤整合成一个可重复执行的流程适合初始化新机器时一键执行。#!/bin/bash # CentOS 7 快速安装 Pyenv 并指定 Python 版本 set -e PYTHON_VERSION${1:-3.10.12} PYENV_ROOT${PYENV_ROOT:-$HOME/.pyenv} echo 安装基础依赖... sudo yum install -y gcc gcc-c make patch \ zlib-devel bzip2-devel readline-devel sqlite-devel \ openssl-devel libffi-devel ncurses-devel \ tk-devel gdbm-devel xz-devel git echo 克隆 Pyenv... if [ ! -d $PYENV_ROOT ]; then git clone https://github.com/xxx/pyenv.git $PYENV_ROOT fi # 配置环境变量 grep -q PYENV_ROOT ~/.bashrc || cat ~/.bashrc EOF export PYENV_ROOT$PYENV_ROOT export PATH$PYENV_ROOT/bin:\$PATH eval \$(pyenv init --path) eval \$(pyenv init -) EOF source ~/.bashrc echo 安装 pyenv-virtualenv 插件... if [ ! -d $PYENV_ROOT/plugins/pyenv-virtualenv ]; then git clone https://github.com/xxx/pyenv-virtualenv.git $PYENV_ROOT/plugins/pyenv-virtualenv echo eval $(pyenv virtualenv-init -) ~/.bashrc fi source ~/.bashrc echo 安装 Python $PYTHON_VERSION ... pyenv install -v $PYTHON_VERSION || true # 如果安装失败给出提示 if ! pyenv versions | grep -q $PYTHON_VERSION; then echo Python 安装失败请检查上面的编译日志 exit 1 fi pyenv global $PYTHON_VERSION echo 验证... python -V pip -V echo 完成这个脚本的要点在于用 set -e 保证任何一步失败立即退出用 grep -q 判断配置是否已经写入避免重复添加安装失败时不中断而是给用户一个明确的错误位置。我自己实际用下来新机器从零到能跑 Python 项目大概十五分钟。有一点要说明脚本里pyenv install前的|| true是为了避免 set -e 在编译失败时直接退出导致看不到错误日志。随后再通过版本列表检查来确认安装是否成功这个写法在自动化部署场景中更友好。8. 常见问题速查表最后把前面提到的典型问题整理成一张速查表方便你直接对照排查。问题直接原因快速解决pyenv命令不存在环境变量未配置检查~/.bashrc中export PATH$PYENV_ROOT/bin:$PATH是否生效pyenv install --list里找不到某版本版本数据库过旧执行pyenv update源码包下载超时网络问题手动下载放入~/.pyenv/cache/编译时报No module named _ssl缺少 OpenSSL 开发包或路径不对yum install openssl-devel升级 OpenSSL 或设置CONFIGURE_OPTS编译时报Killed或internal compiler error内存不足降低MAKE_OPTS并行度安装后python不是目标版本版本未激活或 PATH 顺序混乱pyenv global 3..检查echo $PATH首项pip无法安装 HTTPS 源上的包Python 编译时 ssl 模块缺失重装依赖后重新pyenv install某个项目用了错误的 Python 版本.python-version文件缺失或写错在项目根目录执行pyenv local 目标版本yum 命令不可用系统 Python 环境被破坏不要用 Pyenv 覆盖/usr/bin/python恢复系统默认链接这张表是我根据这些年遇到的高频问题总结出来的。篇幅有限每一种情况的具体处理方式在前面章节都有展开这里只是一个目录性质的存在方便你快速定位。整体来看CentOS 7 上通过 Pyenv 管理 Python 版本核心思路就四个字隔离、可控。系统环境保持洁净开发环境按需安装项目之间彼此独立。这个方案我用了很多年不管是在个人笔记本上、测试服务器上还是生产环境的构建机上都能稳定工作。它虽然不是最“现代化”的工具现在有的人可能会去用 Docker 或者系统自带的模块化 Python但在 CentOS 7 这种老系统的生态里Pyenv 称得上是最省心、最可靠的版本管理方式之一。