本文档涵盖了 uv 的 Python 发现系统,该系统负责根据用户请求和配置的首选项查找和选择 Python 解释器。Python 发现是决定将使用哪个 Python 解释器来运行项目环境、工具执行和其他操作的核心机制。
有关下载和安装托管 Python 版本的信息,请参阅 Python 安装。有关项目工作区 Python 要求的详细信息,请参阅 工作区。
uv 中的 Python 发现遵循可配置的搜索策略,该策略按首选项顺序考虑多个 Python 解释器来源。该系统可以从虚拟环境、托管安装、系统 PATH 和特定于平台的目录(如 Windows 注册表)中发现 Python。
Python 发现流程
来源:crates/uv-python/src/discovery.rs884-923 crates/uv-python/src/discovery.rs416-468
发现系统通过 PythonRequest 枚举接受不同类型的 Python 请求,允许用户以多种方式指定其要求。
| 请求类型 | 示例 | 描述 |
|---|---|---|
默认 | - | 使用合适的默认 Python |
任意 | --python=any | 接受任何可用的 Python |
版本 | --python=3.12 | 特定版本要求 |
文件 | --python=/usr/bin/python3 | 可执行文件的直接路径 |
目录 | --python=.venv | Python 安装目录的路径 |
可执行文件名 | --python=python3.12 | PATH 查找的可执行文件名 |
实现 | --python=pypy | 不带版本号的特定实现 |
实现版本 | --python=pypy@3.10 | 带有版本的实现 |
键 | --python=cpython-3.12-linux-x86_64 | 托管下载的安装密钥 |
来源:crates/uv-python/src/discovery.rs44-68
两个关键的首选项系统控制发现行为
PythonPreference 枚举控制托管 Python 安装和系统 Python 安装之间的优先级
Python 首选项层级
EnvironmentPreference 枚举控制是否允许虚拟环境
OnlyVirtual - 只允许虚拟环境ExplicitSystem - 优先使用虚拟环境,如果明确要求则允许使用系统环境OnlySystem - 只允许系统解释器,忽略虚拟环境Any - 允许任何环境类型来源:crates/uv-python/src/discovery.rs74-89 crates/uv-python/src/discovery.rs129-140
Python 发现根据首选项以可配置的顺序搜索多个来源
Python 发现来源
python_executables_from_virtual_environments() 函数在虚拟环境中搜索 Python
VIRTUAL_ENV 环境变量CONDA_PREFIX 以查找 conda 环境.venv 目录来源:crates/uv-python/src/discovery.rs259-292
python_executables_from_installed() 函数根据 PythonPreference 搜索系统来源
ManagedPythonInstallationspython_executables_from_search_path() 进行标准 PATH 可执行文件搜索来源:crates/uv-python/src/discovery.rs312-414
python_executables_from_search_path() 函数实现了一个智能搜索,它会
python3.12、python3)pypy3.10)来源:crates/uv-python/src/discovery.rs482-561
找到的可执行文件必须通过 python_interpreters_from_executables() 函数验证为工作的 Python 解释器
解释器验证管道
验证过程
Error::is_critical() 区分关键错误和非关键错误EnvironmentPreference来源:crates/uv-python/src/discovery.rs671-690 crates/uv-python/src/discovery.rs799-849
发现系统通过版本文件系统与版本文件(.python-version、pyproject.toml)集成
PythonRequest::Versionrequires-python 被转换为版本约束发现系统与托管 Python 安装集成
ManagedPythonInstallations::find_matching_current_platform() 提供可用的托管安装PythonRequest::Key当发现失败时,系统可以通过 PythonInstallation::find_or_download() 自动下载 Python
find_python_installation() 进行正常发现PythonRequest 转换为 PythonDownloadRequestPythonInstallation::fetch() 下载和安装来源:crates/uv-python/src/installation.rs78-141
发现错误被分类以实现智能回退行为
Error::is_critical() 方法决定发现是否应在错误后继续。