一、什么是 uv?它为何如此特别?
uv 由 Astral 公司(同样是知名 Python 代码检查工具 Ruff 的缔造者)开发。它的核心特性可以概括为 "极速" 和 "全能"。
- 性能的革命: 由于采用 Rust 编写,
uv在依赖解析和包安装上比传统的pip快 10-100 倍。例如,在缓存预热后,其速度甚至能比pip快 80-115 倍。这种性能提升来自于并行下载、全局模块缓存和高效的元数据处理等优化手段。 - 功能的整合:
uv的目标是替代一系列传统的 Python 工具,将多种功能集于一身。它就像一个瑞士军刀,包含了:- pip:用于包安装。
- pip-tools:用于依赖锁定。
- virtualenv/venv:用于虚拟环境管理。
- pyenv:用于 Python 版本管理。
- pipx:用于运行和安装隔离的命令行工具。
- poetry/pdm:用于全面的项目管理。
二、如何安装 uv?
安装 uv 非常简单,官方提供了跨平台的安装脚本:
-
macOS / Linux:
bashcurl -LsSf https://astral.sh/uv/install.sh | sh -
Windows (PowerShell):
powershellpowershell -c "irm https://astral.sh/uv/install.ps1 | iex"
安装完成后,可以通过 uv --version 验证是否成功。对于国内用户,还可以配置清华、阿里云等镜像源来加速下载。
三、uv 的核心功能详解
uv 的功能覆盖了从单文件脚本到大型项目的各种场景,我将它们整理为以下几个核心模块:
📦 项目管理:一站式管理依赖、环境和运行
这是 uv 最核心的现代化工作流,完全基于 pyproject.toml 和 uv.lock 文件。
- 项目初始化 :
uv init my-project会创建一个包含标准文件结构的新项目,如pyproject.toml、main.py和.gitignore。 - 添加/删除依赖 :
uv add requests:添加 PyPI 包作为生产依赖,并自动更新锁文件和环境。uv add pytest --dev:添加一个开发依赖。uv remove requests:移除依赖。
- 环境同步 :
uv sync会根据uv.lock文件精确地创建或更新虚拟环境(位于.venv目录),确保环境一致性。 - 运行命令 :
uv run python main.py或uv run pytest。这是最便捷的功能之一,它会在无需手动激活 虚拟环境的情况下,直接在项目的隔离环境中运行命令。如果环境不是最新的,uv run甚至能自动触发同步。 - 依赖锁定 :
uv lock用于手动创建或更新uv.lock文件。这个文件记录了所有依赖及其传递依赖的精确版本和来源,并且是跨平台的,保证了项目在不同机器上(macOS, Linux, Windows)都能安装到一致的依赖集。
🐍 Python 版本管理:替代 pyenv
uv 内置了 Python 解释器的安装和管理功能,无需再单独安装 pyenv。
- 安装 Python :
uv python install 3.12 3.11可以安装多个指定的 Python 版本。 - 列出可用版本 :
uv python list会显示所有可安装或已安装的 Python 版本。 - 固定项目版本 :
uv python pin 3.12会在当前目录创建一个.python-version文件,告诉uv该项目应该使用哪个 Python 版本。
🛠️ 工具管理:替代 pipx
uv 可以隔离地安装和运行一些作为命令行工具分发的 Python 包,如代码格式化工具 ruff 或 black。
- 运行一次性工具 :
uvx ruff check(uvx是uv tool run的别名)。这个命令会在一个临时的、隔离的环境中下载并运行ruff,执行完毕后环境即被销毁,不会污染系统。 - 安装全局工具 :
uv tool install ruff会将工具安装到一个专用的隔离环境中,并将其可执行文件链接到 PATH 下,之后就可以直接使用ruff命令了。
📜 脚本管理:带有依赖的独立脚本
uv 支持 PEP 723,允许你在 Python 脚本文件的开头,用特定的注释块声明其依赖项。
- 为脚本添加依赖 :
uv add --script script.py requests会自动在script.py文件中添加或更新包含依赖信息的注释块。 - 运行脚本 :
uv run script.py。当运行这样的脚本时,uv会读取其内联元数据,创建一个临时的、包含所需依赖的虚拟环境来执行脚本。这使得分享和运行独立的 Python 脚本变得异常简单。
🔌 兼容 Pip 的接口:平滑迁移
为了照顾老项目和习惯,uv 提供了与 pip 和 pip-tools 完全兼容的命令行接口。
- 安装包 :
uv pip install numpy或uv pip install -r requirements.txt。 - 编译依赖 :
uv pip compile requirements.in -o requirements.txt。 - 创建虚拟环境 :
uv venv。
通过这个接口,你可以在现有项目中立即享受到 uv 带来的速度提升,而无需改变工作流。
四、uv 与 pip、conda 的对比
为了让你更清晰地了解 uv 的定位,这里将其与传统的 pip 和 conda 进行对比:
| 维度 | uv | pip (+ venv) | conda |
|---|---|---|---|
| 底层语言 | Rust | Python | Python |
| 安装速度 | 🚀 极快 (比 pip 快 10-100倍) | 中等 (单线程下载与解析) | 较慢 (依赖复杂 SAT 求解器) |
| 依赖解析 | PubGrub (确定性,冲突解决好) | 简单递归 (易冲突) | SAT 求解器 (全局最优) |
| 虚拟环境 | ✅ 内置 (轻量级 .venv) |
❌ 需搭配 venv/virtualenv |
✅ 内置 (含 Python 解释器) |
| 锁文件 | ✅ uv.lock (跨平台、自动管理) |
❌ 需配合 pip-tools/手动 freeze |
❌ environment.yml 非严格锁文件 |
| Python版本管理 | ✅ 内置 (替代 pyenv) |
❌ 需配合 pyenv |
✅ 内置 |
| 工具管理 | ✅ 内置 (替代 pipx) |
❌ | ❌ |
| 非 Python 依赖 | ❌ (仅纯 Python 包) | ❌ (需手动处理 C 库) | ✅ 支持 (如 CUDA, MKL, R) |
| 适用场景 | 纯 Python 项目、CI/CD、微服务 | 简单脚本、传统项目 | 数据科学、机器学习、跨语言项目 |
五、总结与最佳实践建议
uv 代表了 Python 依赖管理的未来方向,它通过 Rust 带来的性能优势和功能集成,极大地简化了开发者的工作流。
根据你的需求,这里有一些选择建议:
- 如果你是 Python 应用开发者 ,正在启动一个新的 Web 项目(如 FastAPI、Django)或编写脚本,那么
uv是当之无愧的首选。它能让你体验到前所未有的流畅和高效。 - 如果你是数据科学家或机器学习工程师 ,项目重度依赖 CUDA、MKL 等非 Python 库,那么
conda仍然是更合适的选择 ,因为它能无缝管理这些底层库。当然,你也可以探索混合模式,用conda管理环境,用uv pip安装 Python 包。 - 对于需要维护大量遗留代码库的团队 ,可以通过
uv pip接口逐步引入uv,在不改变现有工作流的前提下,立即获得性能提升,并逐步向现代化的项目管理模式迁移。