跳至内容

pyenv

venv/conda/uv 解决的是"同一个 Python 版本下如何隔离依赖"的问题,而 pyenv 解决的是更底层的问题:同一台机器上如何安装、切换多个 Python 解释器版本。不同项目可能要求不同的 Python 大版本(比如老项目还在用 3.8,新项目要求 3.12),系统自带的 Python 通常不适合直接拿来升级或降级,pyenv 通过源码编译安装到用户目录的方式,实现多版本共存与按目录自动切换。

安装依赖

pyenv 是通过源码编译安装 Python 解释器的,因此需要先装好编译工具链(以 CentOS/RHEL 为例):

yum install -y git curl
yum install -y gcc make patch gdbm-devel openssl-devel
yum install -y sqlite-devel readline-devel zlib-devel bzip2-devel

安装 pyenv

# 官方自动安装脚本
curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash

# 国内网络访问 GitHub 较慢时,也可以下载脚本后本地执行
# https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer

# 之后更新 pyenv 本身
pyenv update

安装完成后,按提示把以下内容追加到 ~/.bashrc(或 ~/.zshrc)末尾,然后重新登录或 source 使其生效:

export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
如果服务器访问境外网络(下载 Python 源码包)速度很慢,可以提前把要安装版本的源码包下载好,放到 ~/.pyenv/cache/ 目录(不存在需自行创建),pyenv 安装时会优先使用本地缓存。

安装与切换 Python 版本

# 列出所有可安装的版本
pyenv install -l

# 安装指定版本(源码编译,第一次会比较慢)
pyenv install 3.12.7

# 查看当前生效的版本,system 表示未被 pyenv 接管、使用系统自带版本
pyenv version

# 查看所有已安装的版本,* 号标记当前使用的版本
pyenv versions

# 全局切换默认版本
pyenv global 3.12.7

按目录固定版本

pyenv local 会在当前目录生成一个 .python-version 文件,进入该目录(及其子目录)时自动切换到指定版本,非常适合多项目并行开发:

mkdir -p projects/demo
cd projects/demo

pyenv local 3.12.7
python -V   # Python 3.12.7

配合 pyenv-virtualenv 创建虚拟环境

pyenv-installer 会一并安装 pyenv-virtualenv 插件,可以直接基于某个 pyenv 版本创建虚拟环境,效果上相当于把"版本管理"和"依赖隔离"合二为一:

# 基于 3.12.7 解释器创建一个名为 myproject 的虚拟环境
pyenv virtualenv 3.12.7 myproject

# 让当前目录自动使用这个虚拟环境(生成 .python-version)
pyenv local myproject

# 效果验证
python -V
pyenv version
# myproject (set by /home/user/projects/demo/.python-version)

小结

pyenv 的强项是多 Python 版本共存与自动切换,适合需要在同一台机器上维护多个历史项目、或需要精确控制解释器版本的场景(尤其是 Linux 服务器)。它的短板是安装过程依赖源码编译,速度较慢,也不管理项目的第三方包依赖。日常场景中,uv 已经内置了等价的 Python 版本管理能力(uv python install/pin),如果项目允许引入新工具,可以直接用 uv 一步到位;只有在明确需要 pyenv 生态(如已有 pyenv-virtualenv 工作流)时才需要单独安装它。

最后更新于