Skip to content

02-uv包管理器

uv 是用 Rust 编写的极快 Python 包和项目管理器,由 Astral(Ruff 的创作者)开发。

它比 pip 快 10-100 倍,一个工具替代 pippip-toolspipxpoetrypyenvvirtualenv


安装

bash
# 官方独立安装器(推荐)
# macOS/Linux
curl -LsSf https://astral.sh/uv/install.sh | sh

# Windows
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

# 通过 pip 安装
pip install uv

# 通过 pipx 安装
pipx install uv

# 自我更新(仅独立安装器)
uv self update

项目管理

创建项目

bash
# 初始化新项目
uv init my-project
cd my-project

# 指定 Python 版本
uv init my-project --python 3.12

版本选择策略: 如果不指定版本,uv 按以下顺序决定:

  1. 系统 Python:使用 PATH 中最新的已安装版本。
  2. 配置文件:如果存在 .python-version,优先使用其中指定的版本。
  3. 自动下载:若未找到合适的,自动下载最新的 CPython 版本。

项目结构

my-project/
├── pyproject.toml    # 项目配置和依赖(PEP 621 标准)
├── uv.lock           # 通用锁定文件(跨平台)
├── .python-version   # Python 版本固定
├── .venv/            # 虚拟环境
└── src/
    └── my_project/
        └── __init__.py

依赖管理

bash
# 添加普通依赖(自动添加版本约束)
uv add requests              # 添加 requests>=x.y.z
uv add "httpx>=0.20"         # 手动指定约束

# 添加开发依赖
uv add --dev pytest ruff     # 添加到 dev 组

# 添加可选依赖(extras)
uv add --optional database sqlalchemy

# 使用分组管理开发依赖
uv add --group lint ruff
uv add --group test pytest

# 移除依赖
uv remove requests
uv remove --dev pytest

pyproject.toml 中的依赖字段:

toml
[project]
name = "my-project"
version = "0.1.0"
requires-python = ">=3.11"
dependencies = ["requests>=2.31.0"]

[project.optional-dependencies]
database = ["sqlalchemy>=2.0"]

[dependency-groups]
dev = ["pytest>=8.0"]
lint = ["ruff>=0.3"]

依赖源

uv 支持从多种来源安装依赖:

bash
# 从 Git 仓库安装
uv add git+https://github.com/encode/httpx
uv add git+https://github.com/encode/httpx --tag 0.27.0
uv add git+https://github.com/encode/httpx --branch main
uv add git+https://github.com/encode/httpx --rev abc1234

# 从本地路径安装
uv add ./packages/foo
uv add --editable ../projects/bar    # 可编辑安装

# 从 URL 安装
uv add "https://files.pythonhosted.org/.../httpx-0.27.0.tar.gz"

# 从指定索引安装
uv add torch --index pytorch=https://download.pytorch.org/whl/cpu

对应的 pyproject.toml

toml
[project]
dependencies = ["httpx", "foo", "bar", "torch"]

[tool.uv.sources]
httpx = { git = "https://github.com/encode/httpx", tag = "0.27.0" }
foo = { path = "./packages/foo" }
bar = { path = "../projects/bar", editable = true }
torch = { index = "pytorch" }

[[tool.uv.index]]
name = "pytorch"
url = "https://download.pytorch.org/whl/cpu"

平台特定依赖

bash
# 仅在 Linux 安装
uv add "jax; sys_platform == 'linux'"

# 仅在 Python 3.11+ 安装
uv add "numpy; python_version >= '3.11'"

运行与同步

bash
# 运行命令(自动创建环境并安装依赖)
uv run python main.py
uv run ruff check .

# 指定 Python 版本运行
uv run --python 3.11 python main.py

# 锁定依赖
uv lock

# 同步环境
uv sync
uv sync --all-groups          # 包含所有依赖组
uv sync --no-dev              # 不包含开发依赖

脚本运行

uv 支持 PEP 723 内联脚本元数据,无需手动管理环境:

bash
# 创建带元数据的脚本
uv init --script example.py --python 3.12

# 为脚本添加依赖
uv add --script example.py requests rich

# 运行脚本(自动创建临时环境)
uv run example.py

# 指定依赖运行(无需修改脚本)
uv run --with rich example.py
uv run --with 'rich>12,<13' example.py

# 锁定脚本依赖
uv lock --script example.py

脚本文件格式:

python
# /// script
# requires-python = ">=3.12"
# dependencies = [
#   "requests<3",
#   "rich",
# ]
# ///

import requests
from rich.pretty import pprint

resp = requests.get("https://example.com")
pprint(resp.json())

使用 shebang 创建可执行脚本:

python
#!/usr/bin/env -S uv run --script
# /// script
# dependencies = ["httpx"]
# ///

import httpx
print(httpx.get("https://example.com"))
bash
chmod +x greet
./greet

工具管理

类似 pipx,用于安装 CLI 工具:

bash
# 临时运行工具(隔离环境)
uvx ruff check .
uvx pycowsay 'hello world!'

# 指定版本
uvx ruff@0.5.0 check .
uvx ruff@latest check .

# 从指定包运行命令
uvx --from httpie http

# 安装工具到 PATH
uv tool install ruff
uv tool install 'httpie>0.1.0'

# 安装工具并添加额外依赖
uv tool install mkdocs --with mkdocs-material

# 升级工具
uv tool upgrade ruff
uv tool upgrade --all

# 指定 Python 版本
uvx --python 3.10 ruff

Python 版本管理

uv 内置 Python 版本管理,无需 pyenv

bash
# 安装 Python
uv python install 3.12 3.13
uv python install pypy

# 查看可用版本
uv python list
uv python list --only-installed

# 固定项目 Python 版本
uv python pin 3.11             # 创建 .python-version

# 查找 Python 解释器
uv python find
uv python find '>=3.11'

# 升级 Python(补丁版本)
uv python upgrade 3.12
uv python upgrade              # 升级所有

# 卸载 Python
uv python uninstall 3.12

支持 CPython、PyPy、Pyodide、GraalPy,自动下载安装。


工作区

类似 Cargo workspace,管理多包项目:

toml
# 根 pyproject.toml
[project]
name = "my-workspace"
version = "0.1.0"

[tool.uv.workspace]
members = ["packages/*"]
my-workspace/
├── pyproject.toml
├── uv.lock
└── packages/
    ├── core/
    │   └── pyproject.toml
    └── utils/
        └── pyproject.toml

工作区成员默认以可编辑模式安装:

bash
uv add --dev pytest            # 添加到根项目

pip 兼容接口

兼容现有 pip 工作流,性能提升 10-100 倍:

bash
# 创建虚拟环境
uv venv
uv venv --python 3.12

# 激活环境
source .venv/bin/activate

# 编译依赖(类似 pip-compile)
uv pip compile requirements.in -o requirements.txt
uv pip compile requirements.in --universal -o requirements.txt

# 同步环境(类似 pip-sync)
uv pip sync requirements.txt

# 安装包
uv pip install requests
uv pip install -r requirements.txt

# 查看已安装
uv pip list
uv pip freeze

配置

uv 配置文件 ~/.config/uv/uv.toml 或项目 pyproject.toml

toml
[tool.uv]
# 默认依赖组
default-groups = ["dev", "lint"]

# Python 下载策略
python-downloads = "automatic"    # 自动下载(默认)
python-downloads = "manual"       # 仅手动安装

# Python 偏好
python-preference = "managed"     # 优先 uv 管理的 Python
python-preference = "system"      # 优先系统 Python

# 包索引
[[tool.uv.index]]
name = "tsinghua"
url = "https://pypi.tuna.tsinghua.edu.cn/simple"

包管理器对比

特性pipuvconda
速度极快中等
虚拟环境需配合 venv内置内置
非 Python 包
Python 管理
工具管理
脚本元数据✅ (PEP 723)
锁定文件pip-tools内置environment.yml
工作区

本章小结

┌─────────────────────────────────────────────────────────────┐
│                    uv 包管理器 知识要点                       │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   核心功能:                                                 │
│   ✓ 项目管理 - uv init/add/run/lock/sync                   │
│   ✓ 脚本运行 - PEP 723 内联元数据                          │
│   ✓ 工具管理 - uvx / uv tool install                       │
│   ✓ Python 管理 - uv python install/list/pin               │
│   ✓ 工作区 - Cargo 风格多包管理                            │
│                                                             │
│   依赖管理:                                                 │
│   ✓ 普通依赖、开发依赖、可选依赖、依赖分组                   │
│   ✓ 多种来源:PyPI、Git、URL、本地路径、自定义索引          │
│   ✓ 平台特定依赖、可编辑安装                               │
│                                                             │
│   优势:                                                     │
│   ✓ 10-100x 比 pip 快                                      │
│   ✓ 一个工具替代多个工具                                     │
│   ✓ 全局缓存去重,磁盘高效                                   │
│   ✓ 兼容现有 pip 工作流                                      │
│                                                             │
└─────────────────────────────────────────────────────────────┘