uv 使用指南
这是一个 uv 的使用指南。
什么是 uv?
uv 是一个由 Astral 公司推出的用 Rust 编写的一个很新的 Python 依赖管理工具,其最大特点在于速度极快、功能全面且易于上手。
uv 的目标是成为“Python 的 Cargo”,为开发者提供一个统一的端到端项目管理解决方案,所以基本上可以搞定跟 Python 环境相关的大部分工具。
简单来说,他可以代替 venv 和 Poetry 来帮你管理 Python 项目,可以代替 pyenv 和 conda 帮你管理 Python 版本,代替 pipx 做Python 全局工具的功能,而且非常快。另外,提供 pip 的界面,可以作为 pip 的直接替代品,也可以生成 requirements.txt 给其他工具用。
uv 最开始只是一个 pip 的替代品,不过现在已经扩展到很多方面去了。
uv 的功能包括:
- 🚀 一个工具替代 pip、pip-tools、pipx、poetry、pyenv、twine、virtualenv 等多个工具。
- ⚡️ 比 pip 快 10-100 倍。
- 🗂️ 提供全面的项目管理,使用统一的锁文件。
- ❇️ 运行脚本,支持内联依赖元数据。
- 🐍 安装和管理 Python 版本。
- 🛠️ 运行和安装以 Python 包形式发布的工具。
- 🔩 包含与 pip 兼容的接口,提供熟悉的命令行界面和性能提升。
- 🏢 支持类似 Cargo 的工作空间,适用于可扩展项目。
- 💾 磁盘空间利用率高,通过全局缓存实现依赖项去重。
- ⏬ 无需安装 Rust 或 Python,可通过 curl 或 pip 直接安装。
- 🖥️ 支持 macOS、Linux 和 Windows。
如果你听过 Rye 的话,uv 算是 Rye 的继承项目,把 Rye 吃掉啦。
我在我的开源项目,Open-LLM-VTuber 的 v1.0.0 版本重构中,从 pip 迁移到了 uv,并感觉很爽。如果你也感兴趣的话可以往下读。我个人认为 uv 的使用门槛并不高,不过这是一个比较新的工具,相关文章没有特别多。
安装 uv
安装 uv 的方式很多。
你可以使用 uv 的官方安装脚本来安装 uv。对于 macOS 和 Linux 用户, 运行
1 | curl -LsSf https://astral.sh/uv/install.sh | sh |
对于 Windows 用户,运行
1 | powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" |
对于用安装脚本安装 uv 的用户,可以使用一下命令更新 uv。
1 | uv self update |
除了安装脚本之外,你也可以
- 使用 PyPI 来安装。可以用 pipx:
pipx install uv
,也可以用 pip:pip install uv
- 使用 Cargo 来安装。
cargo install --git https://github.com/astral-sh/uv uv
- 使用 HomeBrew 来安装。
brew install uv
- 使用 WinGet 来安装。
winget install --id=astral-sh.uv -e
- 使用 Scoope 来安装。
scoop install main/uv
- 在 Docker 中使用
更详细的信息可以参考 官方文档
uv 项目管理
你可以用 uv 来管理 Python 项目的依赖,替代 pip,venv,poetry 之类的工具。
uv 遵循 PEP 518 (2016), PEP 621 (2020) 和 PEP 660 (2021) 定义的 pyproject.toml
来管理 Python 项目的依赖和元数据。
使用 uv init 命令来初始化项目。
1 | uv init |
初始化之后,项目目录大概会长这样
1 | .git |
其中最核心的,就是这个 pyproject.toml
文件。项目的元数据和依赖都会写在里面。
pyproject.toml 文件大概长这样:
1 | [project] |
你可以在这个文件中指明项目的版本,项目的 Python 范围,依赖以及依赖的版本以及其他信息。这个文件基本就代替了 requirements.txt 和 setup.py 文件,uv 也可以生成 requirements.txt 方便其他工具使用,不过 pyproject.toml 是 Python 的标准,大部分工具应该也支持使用 pyproject.toml。
添加/移除依赖项
使用 uv add
命令来安装项目依赖。
uv add
会从 PyPi 上下载依赖,安装的依赖会写入到 pyproject.toml
文件中,并且被安装到当前目录下的 .venv
虚拟环境中。
如果当前目录下没有虚拟环境,uv 会帮你建一个。如果 Python 版本没选定,他会帮你选一个。如果没安装 Python,他会帮你装一个。
安装完成后,pyproject.toml
现在变成了这样。
用 uv remove
可以移除依赖项。
安装在 uv 虚拟环境中的依赖项,如果有命令行界面,可以直接用 uv run
运行。比如,我们刚刚安装了 ruff
,这是一个 Python 代码格式化工具,我们就可以用 uv run ruff
来执行这个命令。
uv run main.py
可以使用 uv 来执行 Python 代码 (main.py
为例)。这个命令会带上虚拟环境。