跳到主要内容

uv 完整指南:现代 Python 软件包管理

uv 是一个极速的 Python 软件包和项目管理器,由 Rust 编写。它提供了一个统一的界面来管理 Python 依赖项、虚拟环境、Python 版本和项目。

什么是 uv?

核心架构

组件语言用途替代工具
软件包安装程序Rust快速依赖项解析和安装pip
项目管理器Rust带有锁定文件的现代项目管理poetry, pip-tools
环境管理器Rust虚拟环境创建和管理virtualenv, venv
Python 版本管理器Rust安装和切换 Python 版本pyenv
工具运行程序Rust从软件包中执行 CLI 工具pipx
软件包发布者Rust构建和发布分发版twine

核心特性

  • 🚀 统一工具链:单个命令即可替代 8 个以上的 Python 工具。
  • ⚡️ 极致性能:比 pip 快 10-100 倍(基准测试)。
  • 🗂️ 项目管理:跨平台通用锁定文件支持。
  • 🐍 Python 管理:安装和管理多个 Python 版本。
  • 💾 全局缓存:磁盘空间高效的依赖项去重。

为什么使用 uv?

性能基准测试

操作pip 时间uv 时间速度提升
安装 requests(冷缓存)1.2s0.08s15 倍更快
安装 Flask(热缓存)0.8s0.01s80 倍更快
解析 50 个软件包2.5s0.03s83 倍更快
创建虚拟环境0.5s0.02s25 倍更快

工作流对比

传统工作流(需要 6+ 工具)

# 安装 Python, 创建 venv, 安装依赖, 锁定, 构建...
pyenv install 3.11.0
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
pip-compile requirements.in -o requirements.txt
python -m build

现代 uv 工作流(1 个工具)

# 一个工具搞定所有事
uv init myproject --python 3.11.0
uv add requests flask
uv lock
uv build

快速上手

安装方式

平台命令
macOS / Linux`curl -LsSf https://astral.sh/uv/install.sh
Windows`powershell -c "irm https://astral.sh/uv/install.ps1
Homebrewbrew install uv

pip 命令替换表

pip 命令uv 等效命令
pip install packageuv pip install package
pip install -r reqs.txtuv pip install -r reqs.txt
python -m venv .venvuv venv
pip listuv pip list
pip freezeuv pip freeze

现代项目管理

项目初始化

使用 uv init 快速创建具有标准化结构的新 Python 项目:

# 基础用法:在当前目录初始化
uv init

# 创建新的项目目录
uv init myproject

# 指定 Python 版本
uv init --python 3.11

# 创建应用程序(非库)
uv init --app myapp

# 包含 README 文件
uv init --readme myproject

# 创建不带虚拟环境的项目
uv init --no-venv myproject

生成的项目结构:

myproject/
├── pyproject.toml # 项目元数据和依赖项
├── uv.lock # 通用锁定文件 (提交至 Git)
├── .python-version # Python 版本规范
├── README.md # 项目说明(可选)
└── src/
└── myproject/
└── __init__.py # 包初始化

uv init 生成的 pyproject.toml 文件遵循 PEP 621 标准。如需了解各字段的详细说明和配置最佳实践,请参阅 pyproject.toml 完整指南

项目结构

myproject/
├── pyproject.toml # 项目元数据和依赖项
├── uv.lock # 通用锁定文件 (提交至 Git)
├── .python-version # Python 版本规范
├── src/ # 源代码
└── tests/ # 测试文件

依赖项管理

  • 添加依赖项uv add requests
  • 添加开发依賴項uv add --dev pytest
  • 同步环境uv sync(确保 .venvuv.lock 一致)
  • 运行命令uv run python main.py(自动处理 venv)
最佳实践

始终将 uv.lock 提交到你的存储库。它能确保每个团队成员和 CI 环境使用完全相同的依赖项版本。


进阶功能

脚本支持

运行带有内联依赖项元数据的独立脚本:

# /// script
# dependencies = ["requests", "rich"]
# ///
import requests
from rich import print
print(requests.get("https://api.github.com").status_code)

运行命令:uv run script.py

工具管理

全局安装和运行 Python CLI 工具,而不会污染系统 Python:

uv tool install ruff
uvx ruff check . # 无需永久安装即可运行

Python 管理

uv python install 3.11 3.12 # 安装特定版本
uv python list # 列出已安装版本

CI/CD 集成

GitHub Actions

- uses: astral-sh/setup-uv@v3
- run: uv sync
- run: uv run pytest

Docker

FROM python:3.11-slim
COPY --from=ghcr.io/astral-sh/uv:latest /uv /bin/uv
WORKDIR /app
COPY pyproject.toml uv.lock ./
RUN uv sync --frozen --no-dev

与第三方包管理器集成

某些生态系统(如 OpenMMLab)使用自己的包管理器。uv 负责虚拟环境,这些工具管理各自的包。

工作流程

# 1. 用 uv 创建 venv
uv venv .venv
source .venv/bin/activate

# 2. 通过 uv 安装第三方包管理器
uv pip install openmim

# 3. 用该管理器安装生态内的包
mim install mmdet mmdet3d mmyolo

核心原则

uv 管理环境和 pip 操作;第三方管理器处理其自有的包版本。只要在运行管理器前激活 venv,包就会安装到正确位置。

避免环境混淆

如果未激活 venv,mim install 可能不会使用正确的 pip。使用以下模式之一:

# 链式激活和安装
source .venv/bin/activate && mim install mmdet

# 或通过 venv 的 Python 直接调用 mim
.venv/bin/python -m mim install mmdet

# 或使用 uv run
uv pip install openmim && uv run mim install mmdet

使用 uv run 时,环境会自动正确配置:

uv run mim install mmdet # uv 自动处理环境

总结与建议

  1. 采用 uv init:为新项目使用项目管理功能。
  2. 使用 uv run:停止手动激活虚拟环境。
  3. 提交 uv.lock:确保所有环境的可复现性。
  4. 使用 uv tool:替代 pipx 管理全局 CLI 工具。