Linux下怎么用pyenv管理并升级Python多版本
在Linux上同时维护多个Python版本,最实用的方案是pyenv。它把每个Python版本独立安装到用户目录下,通过修改 PATH 中的shim脚本来决定当前使用哪个版本,不需要sudo权限,也不会干扰系统自带的Python。这篇文章从安装pyenv开始,完整走一遍日常要用到的版本安装、切换、项目绑定、升级和清理操作。
安装pyenv之前的准备
pyenv从源码编译Python,所以需要先装好编译依赖。不同发行版的包名略有差异,下面列出两个常见的:
Ubuntu / Debian:
sudo apt update
sudo apt install -y make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev \
libffi-dev liblzma-dev
CentOS / Fedora:
sudo yum groupinstall -y "Development Tools"
sudo yum install -y zlib-devel bzip2-devel readline-devel \
sqlite-devel openssl-devel xz-devel libffi-devel tk-devel
如果跳过这一步,后面编译Python时可能会报缺少头文件的错误,或者编译出来的Python缺少某些标准库模块(比如 _ssl 、_sqlite3),后续装包会出问题。
安装pyenv
官方推荐用安装脚本一步完成:
curl https://pyenv.run | bash
这条命令会把pyenv安装到 ~/.pyenv 目录下,同时安装 pyenv-virtualenv 和 pyenv-update 两个常用插件。安装完成后,需要把下面几行加到shell配置文件里。如果用的是bash,编辑 ~/.bashrc;如果是zsh,编辑 ~/.zshrc:
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
保存后执行 source ~/.bashrc(或重新打开终端),然后验证一下:
pyenv --version
看到版本号就说明安装成功了。
安装Python版本
先看看pyenv能装哪些版本:
pyenv install --list
这个列表非常长,包含CPython、PyPy、Anaconda等各种发行版。一般只需要关注纯数字版本号的CPython,比如 3.11.10 、3.12.7 、3.13.0 。可以用grep筛选:
pyenv install --list | grep -E "^\s+3\.(11|12|13)\."
选定版本后直接安装:
pyenv install 3.11.10
pyenv install 3.12.7
每个版本的安装都需要从源码编译,通常需要几分钟。编译好的Python会存放在 ~/.pyenv/versions/3.11.10/ 这样的独立目录下,彼此完全隔离。
安装完成后,查看已安装的所有版本:
pyenv versions
前面带 * 号的是当前生效的版本。system 指的是系统自带的Python。
切换Python版本
pyenv提供三种粒度的版本切换,理解它们的作用范围很重要。
全局版本(global)
设置所有终端默认使用的Python版本:
pyenv global 3.12.7
这会把版本号写入 ~/.pyenv/version 文件。之后在任何目录下执行 python 都会使用3.12.7,除非被更高优先级的设置覆盖。
目录版本(local)
给某个项目目录指定专用的Python版本:
cd ~/projects/my-app
pyenv local 3.11.10
这会在当前目录下创建一个 .python-version 文件,内容就是版本号。以后进入这个目录(包括子目录),pyenv自动切换到3.11.10。这个文件可以提交到版本库里,团队成员装了pyenv就能自动用同一个Python版本。
临时版本(shell)
只在当前终端会话里临时切换:
pyenv shell 3.11.10
这实际上是设置了 PYENV_VERSION 环境变量。关掉终端就失效了。取消临时设置用:
pyenv shell --unset
三种设置的优先级从高到低是:shell > local > global。也就是说,如果同时设了三个,当前终端里 shell 说了算;没设shell时,看当前目录有没有 .python-version;都没有就用global。
升级Python版本
pyenv本身没有"原地升级"Python的功能——每个版本都是独立编译安装的。所谓升级,实际操作是:装新版本、把相关设置从旧版本切到新版本、最后卸掉旧版本。
第一步:更新pyenv自身
pyenv可安装的Python版本列表取决于pyenv自身的版本。如果列表里找不到最新的Python,需要先更新pyenv:
pyenv update
这条命令依赖前面安装时附带的 pyenv-update 插件。如果你是通过git手动clone安装的pyenv,也可以进 ~/.pyenv 目录手动 git pull。
第二步:安装新版本
pyenv install 3.12.7
第三步:迁移pip包(可选)
如果旧版本里装了不少包,想在新版本里也用,可以先导出再安装:
# 切到旧版本,导出包列表
pyenv shell 3.11.9
pip freeze > ~/requirements-migrate.txt
# 切到新版本,安装
pyenv shell 3.12.7
pip install -r ~/requirements-migrate.txt
第四步:切换全局或项目版本
# 全局切换
pyenv global 3.12.7
# 或者只切某个项目
cd ~/projects/my-app
pyenv local 3.12.7
第五步:卸载旧版本
确认不再需要旧版本后:
pyenv uninstall 3.11.9
这会删除 ~/.pyenv/versions/3.11.9/ 整个目录,释放磁盘空间。如果某些项目的 .python-version 还指向旧版本号,进入那些目录时pyenv会提示找不到该版本,记得一并修改。
使用pyenv-virtualenv管理虚拟环境
除了版本切换,pyenv还可以通过 pyenv-virtualenv 插件管理虚拟环境。这比单独用 python -m venv 的好处是:虚拟环境也被pyenv统一管理,可以和 local 命令配合实现进目录自动激活。
创建一个基于3.12.7的虚拟环境:
pyenv virtualenv 3.12.7 my-project-env
创建好之后,在 pyenv versions 的列表里就能看到它。绑定到某个项目目录:
cd ~/projects/my-app
pyenv local my-project-env
以后每次进入这个目录,终端会自动激活 my-project-env 虚拟环境;离开目录则自动退出。手动操作也可以:
pyenv activate my-project-env
pyenv deactivate
删除虚拟环境:
pyenv virtualenv-delete my-project-env
pyenv的工作原理
了解pyenv的原理有助于排查问题。pyenv的核心机制是shim——它在 ~/.pyenv/shims/ 目录下为 python、pip 等命令创建了同名的轻量级脚本。因为 ~/.pyenv/shims 在 PATH 中排在系统路径之前,所以你敲 python 时实际上先执行的是这个shim脚本。shim脚本再根据 PYENV_VERSION 环境变量、当前目录的 .python-version 文件或全局设置来决定调用哪个版本的Python。
如果你安装了新的命令行工具(比如通过pip装了 flask),需要执行一次 pyenv rehash 来刷新shim脚本。不过pyenv的较新版本一般会自动完成这个操作。
常见问题排查
编译时报 BUILD FAILED
最常见的原因是缺编译依赖。错误日志里一般会提示缺少哪个头文件或库。按照前面的依赖列表补装后重试即可。也可以看pyenv官方wiki上的 Common build problems 页面,里面列出了各发行版的完整依赖。
装完后python命令没变化
执行 which python 看输出路径。如果不是 ~/.pyenv/shims/python,说明shell配置没有生效。检查两件事:
~/.bashrc(或~/.zshrc)里是否正确添加了pyenv的初始化行。- 是否在修改配置后执行了
source ~/.bashrc或重新打开了终端。
pyenv install --list 里找不到最新版本
说明pyenv自身版本比较旧。执行 pyenv update 更新后再查看列表。
某个项目突然提示Python版本不存在
检查项目目录下的 .python-version 文件,里面写的版本号可能已经被你卸载了。用 pyenv versions 确认当前有哪些版本,然后用 pyenv local 重新指定一个已安装的版本。
常用命令速查
下面整理了日常最常用的pyenv命令,方便随时查阅:
# 查看已安装的版本
pyenv versions
# 查看当前生效的版本及设置来源
pyenv version
# 列出可安装的版本
pyenv install --list
# 安装指定版本
pyenv install 3.x.x
# 卸载指定版本
pyenv uninstall 3.x.x
# 设置全局默认版本
pyenv global 3.x.x
# 设置当前目录的版本
pyenv local 3.x.x
# 设置当前终端的临时版本
pyenv shell 3.x.x
# 创建虚拟环境
pyenv virtualenv 3.x.x env-name
# 删除虚拟环境
pyenv virtualenv-delete env-name
# 更新pyenv
pyenv update
pyenv把多版本管理这件事做得很纯粹——不改系统Python、不需要root权限、不同项目可以用不同版本。配合 pyenv-virtualenv 插件,基本可以覆盖日常开发中所有的Python版本管理需求。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









