首页
/ uv 全景指南:用 Rust 编写的 Python 包、项目、脚本与工具一体化管理器

uv 全景指南:用 Rust 编写的 Python 包、项目、脚本与工具一体化管理器

2026-09-06 11:47:08作者:史锋燃Gardner

uv 是一个用 Rust 编写的极高速 Python 包与项目管理器,单工具覆盖了 pippip-toolspipxpoetrypyenvtwinevirtualenv 的职责。本文基于 uv 官方首页文档(docs/index.md)展开,结合仓库源码与基准测试方法,带你完整掌握 uv 的四大核心界面——项目、脚本、工具与 pip 兼容接口——以及 Python 版本管理。读完后你可以独立完成从安装 uv、初始化并锁定依赖、运行单文件 PEP 723 脚本,到以 drop-in 方式替换既有 pip/pip-tools 工作流的全套操作。

uv 热缓存安装 Trio 依赖的基准测试柱状图

一、uv 是什么:一个工具替代七个

uv 的定位可以用一张"命令职责映射"来理解(源自 docs/index.md 的 Highlights 小节):

传统工具 对应 uv 能力 主要命令
pip / pip-tools pip 兼容接口 uv pip compileuv pip syncuv pip install
pipx 工具安装与执行 uvx(即 uv tool run)、uv tool install
poetry / rye 项目管理 uv inituv adduv lockuv syncuv run
pyenv Python 版本管理 uv python installuv python pin
twine 构建与发布 uv builduv publish
virtualenv 虚拟环境 uv venv

核心特性还包括:

从源码结构看,这个"单工具"确实由单一 Rust 二进制承载:仓库根目录 Cargo.toml 定义了一个包含 60 余个 crates/uv-* 子 crate 的工作区(解析器、缓存、Python 发现、发行版元数据等),而用户可见的入口是 crates/uv/src/bin/ 下的三个二进制:uv.rsuvx.rsuvw.rs。当前工作区版本为 0.12.9,采用 Rust edition 2024(rust-version = "1.96.0"),许可证为 MIT OR Apache-2.0。

二、安装与升级

2.1 官方独立安装器(推荐)

无需 Rust 或 Python 工具链:

# macOS 和 Linux
$ curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows
PS> powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

如果系统没有 curl,可改用 wget -qO- https://astral.sh/uv/install.sh | sh;如需锁定特定版本,把版本号写进 URL,例如 curl -LsSf https://astral.sh/uv/0.12.9/install.sh | sh(详见 安装文档)。

2.2 其他安装途径

  • PyPIpipx install uv(推荐隔离环境)或 pip install uv。uv 为多数平台提供预编译 wheel;目标平台无 wheel 时将从源码构建,此时需要 Rust 工具链。
  • Homebrewbrew install uvMacPortssudo port install uv
  • WinGetwinget install --id=astral-sh.uv -eScoopscoop install main/uv
  • Docker:官方镜像 ghcr.io/astral-sh/uv
  • Cargocargo install --locked uv(从源码构建,需要 Rust 工具链)

2.3 升级与卸载

通过独立安装器安装的 uv 可自我更新:

$ uv self update

由其他途径安装时自我更新功能不可用,需使用对应包管理器升级(如 pip install --upgrade uv)。卸载时先清理数据(uv cache clean、删除 uv python diruv tool dir 所指目录),再移除 uvuvxuvw 二进制;完整步骤见 安装文档

三、项目管理:init、add、lock、sync 的完整工作流

uv 管理项目依赖与虚拟环境,体验接近 poetry/rye。官方文档给出的端到端会话值得逐行对照:

$ uv init example
Initialized project `example` at `/home/user/example`

$ cd example

$ uv add ruff
Creating virtual environment at: .venv
Resolved 2 packages in 170ms
   Built example @ file:///home/user/example
Prepared 2 packages in 627ms
Installed 2 packages in 1ms
 + example==0.1.0 (from file:///home/user/example)
 + ruff==0.5.4

$ uv run ruff check
All checks passed!

$ uv lock
Resolved 2 packages in 0.33ms

$ uv sync
Resolved 2 packages in 0.70ms
Checked 1 package in 0.02ms

各步骤的语义:

  • uv init example:生成包含 pyproject.toml 的项目骨架;
  • uv add ruff:声明依赖并触发一次"解析 + 构建 + 安装"的完整闭环——自动创建 .venv,把项目本身和 ruff 一起写入虚拟环境,同时更新锁文件;
  • uv run ruff check:在项目环境中执行命令,若依赖未同步会先自动同步,保证"环境即代码";
  • uv lock / uv sync:前者只做依赖解析并刷新 uv.lock,后者按锁文件将环境对齐到声明状态。

锁文件的格式与字段说明见 项目布局概念文档,从零建立项目的完整指南见 项目指南

值得强调的是,uv 的构建与发布能力不要求项目由 uv 管理:任何符合 PEP 517 的 Python 项目都可以用 uv build 打包、用 uv publish 发布(对应源码入口在 crates/uv/src/commands/publish.rsbuild_frontend.rs),详见打包指南

四、单文件脚本:PEP 723 内联元数据

uv 为单文件脚本提供"声明式依赖"能力:脚本头部注释中内嵌元数据,运行时自动解析并安装。最小示例:

$ echo 'import requests; print(requests.get("https://astral.sh"))' > example.py

$ uv add --script example.py requests
Updated `example.py`

uv add --script 会为脚本补上 PEP 723 元数据块(# /// script 注释)并写入 dependencies。之后运行:

$ uv run example.py
Reading inline script metadata from: example.py
Installed 5 packages in 12ms
<Response [200]>

uv run 会为脚本在隔离的虚拟环境中安装声明的依赖后执行,不污染任何现有环境。从源码看,脚本处理集中在 crates/uv/src/lib.rs 中对 Pep723Script 的读取与分发:uv add --scriptuv lock --script 允许元数据块不存在时自动创建;而 uv removeuv syncuv treeuv exportuv audituv check 等命令则要求元数据块已存在,缺失时会提示运行 uv init --script <路径> 初始化。完整的脚本工作流(内联元数据字段、远程脚本执行等)见 脚本指南

五、工具管理:uvx 与 uv tool install

uv 执行和安装"以 Python 包形式发布的命令行工具",定位等价于 pipx

临时执行——uvxuv tool run 的独立别名(独立二进制见 crates/uv/src/bin/uvx.rs):

$ uvx pycowsay 'hello world!'
Resolved 1 package in 167ms
Installed 1 package in 9ms
 + pycowsay==0.0.0.2
  """

  ------------
< hello world! >
  ------------
   \   ^__^
    \  (oo)\_______
       (__)\       )\/\
           ||----w |
           ||     ||

包被安装进临时环境并立即执行,适合"只用一次"的场景。

持久安装——把可执行文件暴露到 PATH:

$ uv tool install ruff
Resolved 1 package in 6ms
Installed 1 package in 2ms
 + ruff==0.5.4
Installed 1 executable: ruff

$ ruff --version
ruff 0.5.4

工具环境的管理(列出、升级、卸载工具与数据目录)见 工具指南工具概念文档

六、Python 版本管理:安装、按需下载与钉住版本

uv 内置 Python 解释器的安装与切换,等价于 pyenv 且免编译。

一次安装多个版本

$ uv python install 3.10 3.11 3.12
Searching for Python versions matching: Python 3.10
Searching for Python versions matching: Python 3.11
Searching for Python versions matching: Python 3.12
Installed 3 versions in 3.42s
 + cpython-3.10.14-macos-aarch64-none
 + cpython-3.11.9-macos-aarch64-none
 + cpython-3.12.4-macos-aarch64-none

按需下载精确版本——包括 CPython 与 PyPy 等实现:

$ uv venv --python 3.12.0
Using CPython 3.12.0
Creating virtual environment at: .venv
Activate with: source .venv/bin/activate

$ uv run --python pypy@3.8 -- python
Python 3.8.16 (a9dbdca6fc3286b0addd2240f11d97d8e8de187a, Dec 29 2022, 11:45:30)
[PyPy 7.3.11 with GCC Apple LLVM 13.1.6 (clang-1316.0.21.2.5)] on darwin

在当前目录钉住版本——生成 .python-version 文件,后续命令在该目录下自动使用:

$ uv python pin 3.11
Pinned `.python-version` to `3.11`

可用的实现与下载方式详见 安装 Python 指南Python 版本概念文档

七、pip 兼容接口:不改动工作流即可提速

uv pip 提供 pippip-toolsvirtualenv 常用命令的 drop-in 替代,直接操作虚拟环境(区别于自动管理环境的 uv sync 等高级命令)。官方扩展了这些接口:依赖版本覆写(overrides)、平台无关解析(universal)、可复现解析、备选解析策略等。典型三步走:

1. 把声明式需求编译为平台无关的锁文件:

$ uv pip compile requirements.in \
   --universal \
   --output-file requirements.txt
Resolved 43 packages in 12ms

2. 创建虚拟环境:

$ uv venv
Using CPython 3.12.3
Creating virtual environment at: .venv
Activate with: source .venv/bin/activate

3. 按锁文件精确安装:

$ uv pip sync requirements.txt
Resolved 43 packages in 11ms
Installed 43 packages in 208ms
 + babel==2.15.0
 + black==24.4.2
 + certifi==2024.7.4
 ...

pip 接口文档 可以确认一个重要的实现事实:uv 不依赖也不调用 pip——"pip 接口"仅是命名习惯,用以区分这组低级命令与更高层的项目命令。兼容性边界(与 pip 行为的差异点)在 pip 兼容性指南中有专门说明。命令在入口处的分发逻辑可在 crates/uv/src/lib.rs 中对照阅读:uv pip compileuv pip sync 各自解析 CLI 参数、约束(constraints)、覆写(overrides)与排除(excludes)等来源,再统一进入 commands::pip_compile / commands::pip_sync

八、性能声明如何验证:基准测试方法论

"10-100x 快于 pip" 不是空口宣称。BENCHMARKS.md 给出了完整的度量口径与复现步骤:

  • 测试对象:以 Trio 的 docs-requirements.in 作为代表性真实项目;
  • 四组场景:热/冷缓存 × 安装/解析(对应 uv syncuv lock),"冷"等价于全新机器或 CI 上首次运行;
  • 硬件口径:基准在 macOS 上用 Python 3.12.4 运行非 uv 工具,且明确声明不同操作系统、文件系统与包集合会导致结果显著波动(例如 uv 在 macOS 上采用 reflink、在 Linux 上采用 hardlink 做高效安装);
  • 复现工具scripts/benchmark 包封装了 hyperfine,在 scripts/benchmark 目录下可运行解析与安装两类对比:
# 解析对比(uv / poetry / pdm / pip-compile)
uv run resolver \
    --uv-project --poetry --pdm --pip-compile \
    --benchmark resolve-warm --benchmark resolve-cold \
    --json ../requirements/trio.in

# 安装对比(uv / poetry / pdm / pip-sync)
uv run resolver \
    --uv-project --poetry --pdm --pip-sync \
    --benchmark install-warm --benchmark install-cold \
    --json ../requirements/compiled/trio.txt

生成图表需要本地 uv release 构建(cargo build --release)、生产版 uv 二进制与 hyperfine;之后用 cargo run -p uv-dev --all-features render-benchmarks <json> --title "<标题>" 渲染(依赖 Roboto 字体)。文档还提示:冷缓存基准若方差异常,通常是 ISP 对短时密集请求做了限流,可改用 VPN 规避。

九、进一步阅读

登录后查看全文
热门项目推荐
相关项目推荐