uv 的 Python 支持策略:版本分级、实现支持矩阵与源码中的版本下限校验
本文围绕 uv 官方政策文档 docs/reference/policies/python.md 展开,完整解读 uv 对 Python 版本(3.6 ~ 3.14、3.15 预发布版)与 Python 实现(CPython、PyPy、GraalPy、Pyodide、Pyston)的分级支持策略,并结合 uv-python crate 的源码说明版本下限校验与实现识别在 uv 内部是如何落地的,帮助读者为项目选型合适的解释器版本与管理方式。
1. Python 版本支持分级(Tier 1 / Tier 2)
uv 对 Python 版本采用分级的支持策略,这与 平台支持策略 中 Tier 的定义一脉相承:
Tier 1 支持("保证可用",持续测试):
- Python 3.10
- Python 3.11
- Python 3.12
- Python 3.13
- Python 3.14
Tier 1 意味着这些版本会持续纳入 uv 的测试矩阵,可以视为"guaranteed to work"。
Tier 2 支持("预期可用",但已到达生命周期终点):
- Python 3.6
- Python 3.7
- Python 3.8
- Python 3.9
uv 仍在测试这些版本,但它们已到达 Python 官方的生命周期终点(end-of-life),不再接收安全修复,因此官方文档明确表示"不推荐使用"这些版本。
此外:
- uv 对 Python 3.15 的预发布版本提供 Tier 2 支持;
- Python 3.6 之前的版本不受支持,uv 无法在其上工作。
这个"3.6 下限"并非只是文档约定,而是在 uv 的 Python 发现(discovery)逻辑中被硬性实现的。在 crates/uv-python/src/discovery.rs 中,VersionRequest::check_supported 方法会对用户请求的版本逐一校验:只要请求的 major.minor 小于 (3, 6),就会返回类似 Python <3.6 is not supported but 3.5 was requested. 的错误。此外,解释器探测阶段在 crates/uv-python/src/interpreter.rs 中也定义了 UnsupportedPythonVersion("Please use Python 3.6 or newer")与 InterpreterNotSupported(要求解释器支持 -I 标志,同样要求 Python 3.6+)两类错误。也就是说,版本下限在"版本请求解析"和"实际解释器探测"两个层面都有校验,从源码结构看这是一道双保险。
2. Python 实现支持分级
版本之外,uv 按"实现"(implementation)维度区分支持等级:
Tier 1(CPython):
- CPython
与平台策略相同,Tier 1 意味着"保证可用"。关键点在于:uv 支持对 Tier 1 实现的托管安装(managed installations),且这些构建(builds)由 Astral 维护——对应即 python-build-standalone 项目的发行版(这一点在 crates/uv-cli/src/lib.rs 的 uv python install 帮助文本中也有说明:"CPython distributions are downloaded from the Astral python-build-standalone project")。
Tier 2(预期可用):
- PyPy
- GraalPy
- Pyodide
uv 对这些实现"预期可用",同样支持托管安装,但这些发行版的构建并非由 Astral 维护。例如 PyPy 的托管发行版来自 python.org 官方分发源(crates/uv-cli/src/lib.rs)。uv 还为此提供了 pypy-mirror 配置项,用于替换 PyPy 下载源的基础 URL(crates/uv-cli/src/lib.rs),便于内网或镜像环境下安装。
Tier 3("应该可用",稳定性可能有差异):
- Pyston
3. 源码视角:uv 如何识别 Python 实现
文档中的实现分级最终要落到 uv 的实现识别机制上。crates/uv-python/src/implementation.rs 定义了核心的 ImplementationName 枚举:
pub enum ImplementationName {
Pyodide,
GraalPy,
PyPy,
#[default]
CPython,
}
从源码结构看,有几点值得注意:
- 四种"已知"实现。枚举只包含 Pyodide、GraalPy、PyPy、CPython,即与文档中 Tier 1 + Tier 2 的名单对应;Pyston(Tier 3)不在该枚举内,这与它"稳定性可能波动"的最低支持等级相符。
- 默认实现是 CPython(
#[default]),因此省略实现名时,uv python系列命令的操作对象就是 CPython。 - 长名与平台标签短名双轨。
long_name()返回cpython/pypy/graalpy/pyodide,short_name()返回平台兼容性标签(platform tag)风格的缩写cp/pp/gp(Pyodide 无缩写)。解析逻辑(implementation.rs)会先做大小写不敏感的长名匹配,再尝试短名匹配,因此cp312、CPython 3.12、cp@3.12这类写法都能被识别。 - 宽容解析(Lenient parsing)。
LenientImplementationName对无法识别的实现名不会报错,而是归入Unknown(String)分支(implementation.rs)。这与 crates/uv-cli/src/lib.rs 中的 CLI 说明一致:uv 支持发现 CPython、PyPy、GraalPy 解释器,发现过程中遇到不支持的解释器会直接跳过;如果显式请求了一个不被支持的实现名,才会给出相应提示。 - 实现与解释器的匹配规则。
matches_interpreter方法对 Pyodide 采用特殊判断(解释器运行在 emscripten 环境即视为匹配),其余实现则按名称大小写不敏感比较(implementation.rs)。
4. 实战用法:请求"实现 + 版本"
上述机制对应的用户侧命令格式在 crates/uv-cli/src/lib.rs 的 --python 参数帮助文本中有完整定义,支持的写法包括:
<implementation> 例如 cpython 或 cp
<implementation>@<version> 例如 cpython@3.12
<implementation><version> 例如 cpython3.12 或 cp312
<implementation><version-specifier> 例如 cpython>=3.12,<3.13
<implementation>-<version>-<os>-<arch>-<libc>
例如 cpython-3.12.3-macos-aarch64-none
对于托管安装,可以直接用"实现 + 版本"组合下载并安装指定实现。仓库的集成测试 crates/uv/tests/python/python_install.rs 中 python_install_build_version_pypy 用例展示了 PyPy 的实际行为:请求 pypy3.10 时,uv 会解析出匹配的托管发行版(如 pypy-3.10.16)并安装到托管目录;当请求的构建号不存在(如把 PyPy 构建版本设为 99.99.99)时,会依次报出 No interpreter found for PyPy 3.10 或 No download found for request: pypy-3.10-<platform> 错误。从测试快照可以看出,托管安装目录按 pypy-3.10.16-<平台> 这样的"实现-版本-平台"命名规则组织。
另一个细节是预发布版本的版本下限校验:crates/uv-python/src/discovery.rs 中,check_supported 还会检查 free-threading(t 后缀)请求——t 变体仅 Python 3.13 及以上支持,早于 3.13 的 free-threading 请求会直接被拒绝。这与 3.13/3.14 处于 Tier 1 名单的事实相互印证。
5. 选型建议(基于当前仓库文档)
- 新项目:优先选择 Tier 1 的 CPython 3.10–3.14,通过
uv python install 3.12之类的命令获取 Astral 维护的托管发行版,可获得"保证可用"的最高等级支持; - 遗留项目:3.6–3.9 处于 Tier 2 且已 EOL,仅"预期可用",官方不推荐继续使用,建议规划升级路径;
- 3.15:当前仅对预发布版本提供 Tier 2 支持,生产环境不建议依赖;
- 非 CPython 实现:PyPy、GraalPy、Pyodide 可用(含托管安装,PyPy 可通过
pypy-mirror配置镜像源),但构建不由 Astral 维护;Pyston 为 Tier 3,属"应该可用",稳定性风险自担; - 3.6 之前:任何版本与任何实现组合均不受支持,uv 会在版本请求解析阶段直接报错。
6. 小结
uv 的 Python 支持政策用三层结构回答了"能用哪个 Python"的问题:版本维度(3.10–3.14 为 Tier 1,3.6–3.9 与 3.15 预发布为 Tier 2,3.6 以下不支持);实现维度(CPython 为 Tier 1 且构建由 Astral 维护,PyPy/GraalPy/Pyodide 为 Tier 2,Pyston 为 Tier 3);以及贯穿两者的"托管安装"能力(支持 CPython 与 PyPy,发行版来源分别为 Astral 维护的 python-build-standalone 与 python.org)。源码层面,3.6 版本下限在 discovery.rs 的请求解析与 interpreter.rs 的解释器探测中双重校验,实现识别与命名规则由 implementation.rs 中的 ImplementationName 枚举完整承载,为 uv python list、uv python install、--python 参数等命令行为提供了统一基础。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0627
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00