uv
1. 定义
uv 是 Astral 公司用 Rust 写的 Python 包管理器 + 项目管理工具,定位是 pip / pip-tools / virtualenv / pipx / poetry 的统一替代品。 最大卖点:快(比 pip 快 10~100 倍),并把 Python 环境、依赖、版本管理整合到一个命令里。
类比:uv 之于 Python,相当于 pnpm 之于 Node、cargo 之于 Rust——一个工具搞定”装包 + 环境 + 项目”。
2. uv 解决了什么问题
传统 Python 工具链是割裂的:
| 任务 | 传统工具 | uv |
|---|---|---|
| 装包 | pip install | uv pip install 或 uv add |
| 虚拟环境 | python -m venv / virtualenv | uv venv |
| 锁定依赖 | pip-tools (pip-compile) | uv lock |
| 运行脚本/工具 | pipx run | uv run / uvx |
| 项目管理 | poetry / hatch | uv init / uv add / uv sync |
| 管理 Python 版本 | pyenv | uv python install |
痛点:装一套环境要在 5 个工具之间切换,每个还慢。uv 把这些全合并了,且用 Rust 实现,速度碾压。
3. 核心概念
uv命令本身:跨项目的 CLI 工具,类似 pip- 项目模式 (Project mode):基于
pyproject.toml+uv.lock管理一个 Python 项目,类似 poetry uv.lock:跨平台锁文件,记录所有依赖的精确版本和 hashuvx/uv tool:临时运行或全局安装 CLI 工具(替代 pipx)- Python 版本管理:uv 自带 Python 发行版下载,不需要再装 pyenv
4. 常用命令
环境管理
uv venv # 在当前目录创建 .venv(默认用系统 Python)
uv venv --python 3.12 # 指定 Python 版本创建
uv python list # 列出可用 Python 版本
uv python install 3.12 # 下载安装 Python 3.12(不需要 pyenv)包管理(pip 兼容模式)
uv pip install requests # 装包到当前环境
uv pip install -r requirements.txt
uv pip list # 列出已装包
uv pip uninstall requests
uv pip freeze # 导出已装包项目管理(推荐方式)
uv init my-project # 创建新项目(生成 pyproject.toml)
cd my-project
uv add requests # 添加依赖,自动写入 pyproject.toml + 更新 lock
uv add --dev pytest # 添加开发依赖
uv remove requests # 移除依赖
uv sync # 按 uv.lock 同步安装环境(新人 clone 后第一步)
uv lock # 重新解析依赖、更新 lock 文件
uv run python main.py # 在项目环境里运行(无需手动 activate)
uv run pytest # 在项目环境里跑命令工具运行(替代 pipx)
uvx ruff check . # 临时运行 ruff,不污染环境
uvx black main.py # 临时运行 black
uv tool install ruff # 全局安装 CLI 工具
uv tool list # 列出已装工具
uv tool upgrade ruff # 升级工具
uv tool uninstall ruff # 卸载工具4.5 uv add vs uv pip install(高频困惑)
两个都能”装包”,但属于两套不同的工作模式,混用会出问题:
uv add <包> | uv pip install <包> | |
|---|---|---|
| 属于 | 项目模式(管理一个项目) | pip 兼容模式(当快版 pip 用) |
会改 pyproject.toml 吗 | ✅ 写入 dependencies | ❌ 不写,装完不留记录 |
会更新 uv.lock 吗 | ✅ 更新锁文件 | ❌ 不碰锁文件 |
| 装到哪 | 项目的 .venv(uv 自动管理) | 当前激活/指定的环境 |
| 可复现吗 | ✅ 别人 uv sync 能还原 | ❌ 环境是临时的、不可追踪 |
| 类比 | 像 npm install <包>(记进 package.json) | 像直接 pip install(只装不记) |
怎么选:
- 在做一个项目(有
pyproject.toml)→ 一律用uv add/uv remove,让依赖被pyproject.toml+uv.lock记录、可复现 - 只是想临时装个包试试、或在非 uv 项目里当快版 pip 用 → 用
uv pip install
⚠️ 核心坑:在项目模式里用了
uv pip install,包虽然装进了.venv,但没写进pyproject.toml——别人 clone 后uv sync装不到它,“在我机器上能跑”重现。项目里要装依赖,认准uv add。
# 项目模式(推荐)——依赖被记录、可复现
uv add requests # 加依赖,写入 pyproject.toml + 更新 lock
uv add --dev pytest # 开发依赖
uv remove requests # 移除(同时清理 pyproject.toml + lock)
uv sync # 按 lock 还原整个环境
# pip 兼容模式——只装不记,临时用
uv pip install requests # 等价于 pip install,但更快;不碰 pyproject.toml5. uv vs pip vs poetry 速查
| 维度 | pip | poetry | uv |
|---|---|---|---|
| 速度 | 慢 | 慢 | 极快(Rust + 全局缓存) |
| 锁文件 | 无(freeze 不算) | poetry.lock | uv.lock |
| 虚拟环境 | 需配合 venv | 自动 | 自动 |
| Python 版本管理 | 不能 | 不能 | 能 |
| 项目管理 | 不能 | 能 | 能 |
| pip 兼容 | — | 部分兼容 | 子命令兼容 |
| 全局缓存 | 无 | 无 | 有(硬链接,省磁盘) |
6. 典型工作流
新项目
uv init my-app
cd my-app
uv add fastapi uvicorn
uv add --dev pytest ruff
uv run uvicorn main:app --reload接手已有项目
git clone <repo>
cd <repo>
uv sync # 一条命令搞定:读 pyproject.toml + uv.lock,建 .venv,装所有依赖临时跑个工具(不污染系统)
uvx httpie # 临时跑 http 命令行工具7. 常见坑
uv sync和uv pip install混用:项目模式下用uv sync,不要再用uv pip install手动装包,否则 lock 会乱uv run必须在项目目录:它会向上找pyproject.toml,找不到就用系统环境- 速度突然变慢:第一次跑会下载 Python 和构建缓存,之后才会快;持续慢可能是缓存目录权限问题
uv add后包没生效:检查是不是在正确的.venv里运行;项目模式下 uv 自动管理 venv,不用手动 activate
8. 延伸阅读 / 关联概念
pyproject.toml— 现代 Python 项目配置标准,uv / poetry / hatch 都用它ruff— 同为 Astral 出品的 Python linter,也是 Rust 写的,速度极快pip-tools— uv 锁文件功能的前身,pip-compile + pip-sync- Astral 官方文档:https://docs.astral.sh/uv/