个人的 Python 环境配置 cheatsheet

原文参考: Real Python – Managing Multiple Python Versions with pyenv

适用平台: macOS/Linux/WSL

What and Why

pyenv轻量级 Python 多版本管理工具,可以帮助用户在不同版本 Python 间切换。 现代语言比如 Rust 使用官方维护的 rustup 来进行版本管理,pyenv 项目是第三方维护,参考 Ruby 语言的 rbenvruby-build 开发的 Python 语言版本控制工具。

pyenv 主要解决单机多版本 Python 管理问题,并可结合虚拟环境(如 venvpyenv-virtualenv) 实现项目级依赖隔离,防止包污染与冲突。

理解使用 pyenv 的好处

TL;DR 使用pyenv 主要是解决单机器上灵活配置多个 Python 版本(包括 py2 和 py3 )。此外,为保证不同项目之间的隔离性,使安装的依赖包不污染系统环境或相互冲突,可配合项目独立的虚拟环境实现。

pyenv 是一个专门用于“干净地管理多个 Python 版本”的工具。即使你的操作系统已经预装了 Python,安装 pyenv 仍然非常值得——它可以让系统自带的 Python 保持纯净,更重要的是,让你能方便地参与使用不同 Python 版本的项目。

Q:为什么要用 pyenv,而不是直接使用系统自带的 Python?

系统自带的 Python(system Python)是由操作系统直接安装的解释器。 在 macOS 和 Linux 上通常自带一个默认的系统 Python,而在 Windows 上则通常需要你手动安装。

Q:为什么我们不能直接用系统自带的 Python 来日常开发呢?

你可以这样理解:系统的 Python “属于操作系统”。 在很多情况下,操作系统本身的某些组件依赖于这个特定版本的 Python 才能正常工作。 如果你更改了系统 Python 的版本,或修改了它自带的包,很可能导致系统功能出错甚至损坏。

此外,你对系统 Python 的版本往往没有太多控制权。 举例来说,如果你在 Ubuntu 上想使用 Python 的最新特性,可能会发现:官方软件源中的 Python 版本太旧; 需要等待新版本的操作系统发布;等待的过程中,Python 又出了更高版本。结果就是,你始终无法保持“最新版本”。

如果你使用 pip 或类似工具在系统 Python 上安装第三方包,这些包会被安装到全局环境中。 这样会带来问题:当其他用户(或是你自己)想安装不同版本的同一个包来做另一个项目时,在全局环境中你无法获得同一个包的多个版本。

在多数操作系统中,安装新的 Python 版本或第三方包都需要管理员权限。 这在有严格安全策略的企业环境中尤其麻烦,因为你可能得等管理员帮你安装。总之直接使用系统 Python 有以下弊端:

  • 部分破坏操作系统
  • 无法使用最新 Python 版本
  • 依赖旧版本的项目出现问题
  • 依赖新特性的项目无法开发
  • 安装依赖需要管理员介入

✅ 理想的方案:灵活且安全的 Python 环境管理

对于开发者而言,理想的 Python 管理方式应该允许你:

  • 在用户空间安装 Python,无需管理员权限;
  • 自由地安装、管理、卸载多个 Python 版本;
  • 为不同项目指定确切的 Python 版本;
  • 随时在多个版本之间切换。

好消息是,pyenv 能实现以上所有功能。此外,它还支持安装 Python 的预发布版本(pre-release), 方便你提前体验新语言特性或测试新版本的兼容性与潜在问题。

多版本管理工具对比表

特性🦀 Rust – rustup🐍 Python – pyenv💎 Ruby – rbenv
维护方官方社区社区
管理对象编译器与工具链Python 解释器版本Ruby 解释器版本
版本切换机制工具链级别解释器级别解释器级别
隔离机制工具链独立可配合 venvpyenv-virtualenv可配合 gemset 或插件
路径机制~/.cargo/bin shimPATH shim + 环境变量PATH shim + 环境变量
跨平台支持macOS / Linux / WindowsmacOS / Linux / WSLmacOS / Linux
与包管理器关系内建 cargo配合 pip / poetry配合 bundler

精简整理自 GPT5

安装 pyenv

参考 Installation of pyenv | GitHub

对于 macOS 用户可以方便的从 Homebrew 下载

brew update
brew install pyenv

安装完成后,在你的 ~/.zshrc~/.zprofile (bash 则为~/.bashrc~/.bash_profile)末尾添加:

export PYENV_ROOT="$HOME/.pyenv"
[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init - zsh)"
# or
# eval "$(pyenv init - bash)"

核心机制

pyenv 通过一个 “shim 层” 实现版本控制,当 shell 中运行 pythonpip 命令时:

  1. shell 首先命中 ~/.pyenv/shims/python (被 shim 层劫持)
  2. shim 层会根据你的配置 (global/local/shell) 自动转发到正确的解释器

可以通过 which python 观察到命令被劫持,以及 pyenv which python 确认实际运行的解释器。

which python
# /Users/user_name/.pyenv/shims/python
pyenv which python
# /Users/user_name/.pyenv/versions/3.14.0/bin/python

安装与切换 Python 版本

列出可安装版本:

pyenv install --list

安装指定版本

pyenv install 3.12.3
pyenv install 3.14.0

设置全局版本(影响所有 shell) .python-version 文件生成在用户根目录 ~/.pyenv 中:

pyenv global 3.14.0

设置本地版本(仅当前目录) .python-version 在当前目录:

pyenv local 3.12.3

虚拟环境配合 pyenv-virtualenv 使用

在 macOS 环境中,python -m venv 设置的虚拟环境,有时会因 pyenvshim 层劫持导致环境激活异常,建议统一使用 pyenv 和配套插件管理基础版本与虚拟环境。

安装 pyenv-virtualenv 插件:

brew install pyenv-virtualenv

~/.zshrc 末尾额外增加初始化 (bash 为~/.bashrc):

eval "$(pyenv virtualenv-init - zsh)"
# or
# eval "$(pyenv virtualenv-init - bash)"

新建虚拟环境,此处以 3.14.0 环境为基,虚拟环境名称为 venv-name

pyenv virtualenv 3.14.0 venv-name

需要指出的是与 python -m venv .venv 不同,默认并不是在当前工作目录建立, pyenv 将虚拟环境统一到~/.pyenv 中管理:

列出安装的所有版本,或者使用pyenv virtualenvs

pyenv versions
  system
  3.9.24
  3.12.12
* 3.14.0 (set by /Users/user_name/.pyenv/version)
  3.14.0/envs/venv-name
  venv-name --> /Users/user_name/.pyenv/versions/3.14.0/envs/venv-name

清晰显示环境之间的实际关系。使用 pyenv activate venv-name 启动虚拟环境, pyenv deactivate 退出当前环境。

延伸阅读与参考

pyenv GitHub Repository

Managing Multiple Python Versions With pyenv