Skip to main content

多版本管理

入门篇假设本机已有一个可用的 Python 3.10+。实际工作里常要 同时保留多个解释器版本(例如本机 3.10,某仓库要 3.12,CI 矩阵测 3.10–3.13)。

本篇讲 解释器版本 怎么装、怎么切、项目怎么钉死。它和「虚拟环境」不同:venv 是在 某一个 Python 之上隔离包装;多版本是先解决「用哪一个 Python」。

与依赖管理的关系见「项目与包管理」;单版本下的 venv 见「类型提示与虚拟环境」。

先分清两件事

概念解决什么例子
Python 多版本机器上有哪些解释器(3.10 / 3.11 / 3.12…)python3.11pyenvuv python
虚拟环境同一解释器下,项目依赖互不污染.venv/conda env

典型顺序:选对 Python 版本 → 再为该版本建虚拟环境 → 再装依赖

很多时候版本也不是你说了算:仓库的 requires-python.python-version、Dockerfile、CI matrix 才是约束。

为什么需要多版本

  • 不同项目声明了不同的 requires-python
  • 要复现线上/同事的小版本差异(补丁级有时也要命)
  • 库作者要在多个版本上跑测试(tox / nox / CI matrix)
  • 系统自带 Python 太旧或不能乱动(尤其 Linux)

现场信号:项目钉了哪个版本

信号含义
requires-python = ">=3.10"pyproject.toml允许的版本范围
.python-version工具(pyenv / uv 等)优先用的具体版本
runtime.txt / 平台特定文件部分 PaaS 用
Dockerfile FROM python:3.12-slim运行时以镜像为准
CI python-version: ["3.10", "3.12"]要兼容的测试矩阵
Conda environment.yml 里的 python=3.11Conda 环境自带解释器版本

接手项目:先看这些,再装对应解释器;不要只用本机默认 python3「碰巧能跑」就完事。

常见方案(都会遇到)

1. 系统 / 官方安装包并排

  • macOS:brew install python@3.11 等,命令常为 python3.11
  • Windows:官网安装包可装多版;py 启动器py -3.11
  • Linux:发行版包,或 deadsnakes 等第三方源(注意信任与升级策略)

特点:简单;版本一多,PATH 谁优先容易乱。适合「就多两个版本」的轻度需求。

2. pyenv(经典多版本工具)

专门管「装多个 Python + 按目录切换」:

pyenv install 3.12.7
pyenv global 3.12.7 # 用户默认
pyenv local 3.11.9 # 当前目录写入 .python-version
python -V # 应显示被选中的版本

特点:存量教程与项目多;与 venv/pip 搭配常见。进了用 pyenv 的团队,跟 .python-version 即可。

3. uv 管理 Python 版本(绿场友好)

uv 不但管包,也能安装与选择解释器:

uv python install 3.10 3.11 3.12
uv python list
uv python pin 3.12 # 写入 .python-version
uv sync # 按钉死的版本建/用环境
uv run python -V

特点:与本站推荐的项目流一体;不必先装系统 Python 也能拉解释器。存量若全员已用 pyenv,不必强行改。

4. asdf / mise 等通用版本管理器

用插件同时管 Node、Python、其他运行时。团队若统一 asdf/mise,Python 插件那套规则优先。

5. Conda / Mamba

环境里直接带指定 Python:

# environment.yml 片段
dependencies:
- python=3.11
- numpy

数据科学仓库很常见:解释器版本与包 一起由 Conda 管。此时不必再叠一套 pyenv,除非文档明确要求。

6. 容器镜像(团队/生产真相源)

很多服务以 Docker 里的 python:3.x 为准。本机多版本是为了开发体验;部署以镜像/CI 为准。本地可用同主版本的解释器 + venv 贴近开发。镜像与 Compose 通识见工程实践「Docker 基础」。

你不能做主时

  1. 按仓库的 .python-version / requires-python / CI / Dockerfile 安装
  2. 用项目指定的版本管理器(有则用;没有再用系统多版本)
  3. 虚拟环境必须建在 正确主版本 上(3.10 的 venv 不能假装成 3.12)
  4. 不要把「我全局装了最新 Python」当成所有项目的默认

你能做主时(本机与绿场)

本站建议:

  1. uv(或团队已采用的 pyenv)在本机保留 3.10 / 3.11 / 3.12 等需要的版本
  2. 每个项目:uv python pin 或 pyenv local,提交 .python-version(若团队同意)
  3. pyproject.toml 写清 requires-python
  4. 仍为每个项目建独立虚拟环境(版本对 + 依赖隔离)
uv python install 3.12
uv init my-app && cd my-app
uv python pin 3.12
uv add requests
uv run python -V

与虚拟环境、包管理怎么配合

多版本工具选出 python3.12

创建 .venv(基于 3.12)

pip / uv / Poetry … 安装依赖
错误做法问题
只用系统 Python,到处 sudo pip污染系统、升级翻车
版本换了但旧 .venv 还在用解释器路径失效或行为怪异;应重建 venv
requires-python>=3.10,本机却从未用 3.10 测过CI 一跑才发现不兼容

升级项目主版本时:改 pin / requires-python删掉旧 .venv 再 sync/install → 跑测试。

测试多个版本(库/工具作者)

  • CI matrix(GitHub Actions strategy.matrix.python-version 等)是主流
  • 本机可用 tox / nox,或 uv python install 多个版本后分别 uv sync --python 3.11 之类做抽查
  • 应用服务通常 钉一个运行时版本 即可;库才更需要矩阵

决策简表

情境常见做法
团队已有 pyenv / asdf / Conda跟团队
绿场 + 已用 uv 管依赖uv python 一并管解释器
只是本机多装两三个版本brew / 官网安装包 / py -3.x 也可
生产镜像或运行平台钉死;不依赖开发机 PATH
遗留只写了 python3读 CI;补上 requires-python 与文档

要点

  1. 多版本 ≠ 虚拟环境:先选解释器,再隔离依赖
  2. 存量项目看 .python-version / requires-python / CI / 镜像,而不是个人默认 Python
  3. 经典工具:系统并排安装、pyenv、uv python、asdf/mise、Conda、容器
  4. 绿场可与包管理一起用 uv;换主版本后重建虚拟环境
  5. 应用钉版本求稳;库才重点做多版本测试矩阵