Linux下怎么用pyenv管理并升级Python多版本

键盘旁的猫
键盘旁的猫
发布时间:2026-10-22| 6人浏览过
原创

在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
示例输出:
pyenv 2.4.22

看到版本号就说明安装成功了。

Linux下怎么用pyenv管理并升级Python多版本
图1:pyenv从依赖安装到验证的完整流程

安装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 (set by /home/user/.pyenv/version) 3.11.10 3.12.7

前面带 * 号的是当前生效的版本。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。

Linux下怎么用pyenv管理并升级Python多版本
图2:pyenv三种版本切换方式的优先级与作用范围

升级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
注意:跨大版本(比如3.11到3.12)迁移时,部分包可能需要重新编译或不兼容新版本。建议先在新版本上跑一下项目的测试,确认没有问题再正式切换。

第四步:切换全局或项目版本

# 全局切换
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会提示找不到该版本,记得一并修改。

Linux下怎么用pyenv管理并升级Python多版本
图3:升级Python版本的五步操作流程

使用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
Linux下怎么用pyenv管理并升级Python多版本
图4:pyenv核心功能、工作原理与升级要点总结

pyenv把多版本管理这件事做得很纯粹——不改系统Python、不需要root权限、不同项目可以用不同版本。配合 pyenv-virtualenv 插件,基本可以覆盖日常开发中所有的Python版本管理需求。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。