如果你还在忍受 pip install 漫长的依赖解析,或者被 poetry、pyenv、virtualenv、pipx 一堆工具的排列组合折磨,那应该认真看看 uv。它由打造 Ruff 的 Astral 团队用 Rust 编写,官方定位是"An extremely fast Python package and project manager, written in Rust",一个工具替代 pip、pip-tools、pipx、poetry、pyenv、twine、virtualenv 全家桶,Star 数约 90k,采用 MIT 与 Apache 2.0 双协议开源。本文先讲安装与项目工作流,再覆盖脚本运行、工具管理、Python 版本管理与 pip 兼容接口,最后给出迁移建议。
1、概述与安装
uv 是一个独立的二进制程序,不依赖系统里的 Python,也不需要先装 Rust。它把包管理、虚拟环境、Python 版本管理、锁文件、工具安装全部收进一个命令,并用全局缓存避免重复下载,磁盘占用也显著低于传统方案。性能上官方基准称比 pip 快 10~100 倍:热缓存下安装 Trio 的依赖,43 个包的解析只需约 12ms,安装约 208ms。
安装方式任选其一,跨 macOS、Linux、Windows。
curl -LsSf https://astral.sh/uv/install.sh | sh
这是 macOS 与 Linux 的官方安装脚本;Windows 下用 powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex",也可以直接 pip install uv 或 pipx install uv。装好后用 uv self update 自更新,不需要关心升级路径。
2、项目工作流
日常开发最常用的是五个命令:uv init 建项目、uv add 加依赖、uv run 在项目环境中执行、uv lock 生成通用锁文件、uv sync 按锁文件同步环境。一个最小示例如下。
uv init example
cd example
uv add ruff
uv run ruff check
uv init 会生成 pyproject.toml 并自动创建 .venv;uv add ruff 把依赖写入 pyproject.toml 同时更新 uv.lock;uv run 保证在正确的虚拟环境里执行命令——不需要手动 source activate。uv.lock 是跨平台的通用锁文件,锁定所有平台的解析结果,团队成员和 CI 里 uv sync --frozen 即可精确复现环境。uv 还支持 Cargo 风格的 workspaces,一个仓库里多个子项目可以共享依赖与锁文件,monorepo 场景很实用。
3、单文件脚本与工具运行
uv 对"一个脚本搞定一切"的场景做了原生支持:给 Python 脚本内联声明依赖元数据(PEP 723),然后 uv run 会自动准备临时环境执行它。
uv add --script example.py requests
uv run example.py
第一行把 requests 写进脚本的依赖元数据,之后任何人拿到这个单文件,uv run example.py 就能直接跑,不用先建环境装包。另一个高频命令是 uvx(即 uv tool run),临时执行一个 CLI 工具而不污染任何环境。
uvx pycowsay 'hello world!'
uv tool install ruff
uvx pycowsay 'hello world!' 会即时拉起一个包含 pycowsay 的隔离环境并运行,效果等价于 pipx 但快得多。uv tool install 则把工具长期安装到独立环境并暴露命令到 PATH,适合日常使用的 ruff、httpie 这类工具。
4、Python 版本管理
uv 顺带替代了 pyenv:它可以下载并管理多个 Python 版本,包括 CPython 官方构建与 PyPy。
uv python install 3.12 3.13 3.14
uv python pin 3.12
uv venv --python 3.12.0
uv python install 一次装多个版本;uv python pin 3.12 把版本写进项目的 .python-version 文件,团队成员 uv run 时自动对齐;uv venv --python 3.12.0 可以按精确小版本号创建虚拟环境。配合 .python-version 提交进仓库,"本地能跑 CI 不能跑"的版本漂移问题基本消失。
5、pip 兼容接口
存量项目不可能一夜之间迁移到 pyproject.toml 工作流,uv 提供了完整的 pip 兼容层:uv pip install、uv pip compile、uv pip sync、uv venv 等命令的参数与 pip、pip-tools 基本一致。
uv venv
uv pip install -r requirements.txt
uv pip sync requirements.txt
uv pip install -r requirements.txt 行为与 pip install -r 相同,只是快一到两个数量级;uv pip sync 则更严格——它会卸载环境中不在文件里的包,常用于 CI 里构造干净的可复现环境。注意兼容接口不读写 uv.lock,属于过渡方案;新项目建议直接用第 2 节的项目命令。
6、注意事项与选型建议
几个实际使用中值得留意的点。第一,uv 起步较新,部分 poetry 的高级特性(如多约束依赖的细粒度控制)覆盖还在完善中,复杂存量项目迁移前建议先跑 uv lock 比对差异。第二,uv run 会隐式同步环境,CI 中想要"绝不改动环境"的确定性,应加 --frozen 或 --no-sync。第三,私有索引凭据走标准的 UV_INDEX_ 环境变量与 pyproject.toml 的 [[tool.uv.index]] 配置,别把 token 写进锁文件。
横向对比一下常见方案。
| 工具 | 定位 | 速度 | 锁文件 |
|---|---|---|---|
| uv | 全能项目管理 | 极快 | 跨平台通用锁 |
| poetry | 项目管理 | 慢 | poetry.lock |
| pip-tools | 依赖锁定 | 中等 | requirements.txt |
结论很直接:新项目没有理由不首选 uv;老项目可以从 uv pip install 兼容层切入,再逐步迁移到原生工作流。
7、总结
uv 用 Rust 重写了 Python 工具链中体验最差的一环,把 10~100 倍的速度、通用锁文件、Python 版本管理、脚本内联依赖、工具隔离运行打包进一个零依赖的二进制,约 90k Star 的社区热度也证明了它的成熟度。对于新项目,建议直接用 uv init 起步并全程使用项目工作流;对于存量项目,建议先用 uv pip sync 在 CI 中获得确定性环境,再择机迁移到 uv add 与 uv.lock,配合 官方文档 按需深入。

