Python 中的 UV:重新定义 Python 项目管理的极速利器

Python 中的 UV:重新定义 Python 项目管理的极速利器

在 Python 开发的世界中,依赖管理和项目工具链一直是个痛点。直到 UV 的出现,这个用 Rust 编写的工具正在以其惊人的速度重新定义 Python 开发体验。

什么是 UV?

UV 是一个由 Astral 团队开发的 Python 包管理器和项目工作流工具。如果你对 Astral 这个名字感到熟悉,那是因为他们也是近年来备受瞩目的 Python 代码格式化工具 Ruff 的创造者。

与传统的 Python 工具不同,UV 完全使用 Rust 编写,这赋予了它无与伦比的性能优势。但 UV 不仅仅是一个更快的 pip 替代品,它是一个完整的 Python 项目生命周期管理工具,涵盖了从项目初始化、依赖管理、虚拟环境管理到脚本运行的整个工作流。

为什么需要 UV?

在 UV 出现之前,Python 开发者通常需要组合使用多个工具:

  • pip:包安装
  • virtualenv/venv:虚拟环境管理
  • pip-tools:依赖解析
  • Poetry/Pipenv:项目管理和依赖锁定
  • pytest/black:测试和代码格式化

这种工具碎片化导致了配置复杂、学习曲线陡峭和工作流不一致的问题。UV 的目标就是用一个统一、高速的工具解决所有这些需求。

安装指南

快速安装

Linux 和 macOS:

1
2
3
4
5
# 使用安装脚本
curl -LsSf https://astral.sh/uv/install.sh | sh

# 或者使用 Homebrew
brew install uv

Windows:

1
2
3
4
5
# 使用 PowerShell
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"

# 或者使用 Winget
winget install astral.uv

使用 pip 安装(跨平台):

1
pip install uv

验证安装

安装完成后,验证 UV 是否正确安装:

1
2
3
4
uv --version
# 输出示例: uv 0.1.0 (cargo 1.70.0)

uv --help # 查看所有可用命令

升级 UV

1
2
3
4
5
# 如果使用安装脚本安装
uv self update

# 如果使用 pip 安装
pip install --upgrade uv

核心功能详解

1. 项目初始化

创建新项目:

1
2
3
# 创建一个全新的 Python 项目
uv init my-awesome-project
cd my-awesome-project

这个命令会创建一个包含以下结构的项目:

1
2
3
4
5
6
7
8
my-awesome-project/
├── pyproject.toml # 项目配置和依赖声明
├── README.md
├── src/
│ └── my_awesome_project/
│ └── __init__.py
└── tests/
└── __init__.py

从现有项目迁移:

1
2
3
4
5
6
7
8
9
10
11
12
# 从现有目录初始化
cd existing-project
uv init

# 从 requirements.txt 迁移
uv init --from-requirements requirements.txt

# 从 Poetry 项目迁移
uv init --from-poetry pyproject.toml

# 从 Pipenv 项目迁移
uv init --from-pipenv Pipfile

2. 虚拟环境管理

UV 的虚拟环境管理既自动又高效:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 创建虚拟环境(默认在 .venv 目录)
uv venv

# 指定不同的虚拟环境目录
uv venv --path custom-venv

# 使用特定 Python 版本
uv venv --python 3.11

# 激活虚拟环境
# Linux/macOS
source .venv/bin/activate
# Windows
.venv\Scripts\activate

# 在不激活的情况下运行命令
uv run python script.py
uv run pytest

虚拟环境的最佳实践:

1
2
3
4
5
# 将 .venv 添加到 .gitignore
echo ".venv/" >> .gitignore

# 使用 UV 的环境感知功能
# UV 会自动检测项目目录中的虚拟环境

3. 依赖管理

UV 的依赖管理是其核心优势之一:

添加和移除依赖

1
2
3
4
5
6
7
8
9
10
11
# 添加生产依赖
uv add requests flask pandas
uv add "django>=4.2.0" # 指定版本

# 添加开发依赖
uv add --dev pytest black flake8 mypy
uv add -d pre-commit # -d 是 --dev 的简写

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

依赖同步和锁定

1
2
3
4
5
6
7
8
9
10
11
# 安装所有依赖(基于 pyproject.toml)
uv install

# 同步环境 - 确保与锁文件完全一致
uv sync

# 生成 requirements.txt
uv pip freeze > requirements.txt

# 从 requirements.txt 安装
uv pip install -r requirements.txt

依赖组管理

pyproject.toml 中定义依赖组:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[project]
name = "my-project"
dependencies = [
"requests>=2.28.0",
"click>=8.0.0"
]

[project.optional-dependencies]
dev = [
"pytest>=7.0.0",
"black>=23.0.0",
"flake8>=5.0.0"
]
test = [
"pytest>=7.0.0",
"pytest-cov>=4.0.0"
]
docs = [
"sphinx>=6.0.0",
"furo>=2023.0.0"
]

# 安装特定组的依赖
uv install --with dev
uv install --with test,docs

4. 项目脚本和任务运行

UV 可以运行在 pyproject.toml 中定义的脚本:

1
2
3
4
5
6
7
8
[project.scripts]
my-app = "my_package.cli:main"

[tool.uv.scripts]
test = "pytest tests/"
lint = "black --check . && flake8 ."
format = "black . && isort ."
dev = "uv run --watch ./src python -m my_package"

运行脚本:

1
2
3
4
uv run test
uv run lint
uv run format
uv run dev # 监听文件变化自动重启

高级特性

1. 极速包安装

UV 的包安装速度是其最引人注目的特性。以下是与其他工具的对比:

工具 安装时间 (clean env) 安装时间 (with cache)
pip 45.2s 12.8s
Poetry 38.7s 11.3s
UV 3.2s 0.8s
1
2
3
4
5
# 体验极速安装
time uv add numpy pandas matplotlib scikit-learn

# 对比传统 pip
time pip install numpy pandas matplotlib scikit-learn

2. 智能缓存系统

UV 的缓存系统是其速度的关键:

1
2
3
4
5
6
7
8
9
10
11
12
# 查看缓存目录
uv cache dir
# 通常位于: ~/.cache/uv (Linux) 或 ~/Library/Caches/uv (macOS)

# 查看缓存使用情况
uv cache info

# 清理缓存(谨慎使用)
uv cache clean

# 仅清理过期的包
uv cache prune

3. 工作空间支持

对于大型项目或多包仓库,UV 支持工作空间:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 根目录的 pyproject.toml
[project]
name = "my-workspace"

[tool.uv.workspace]
members = [
"packages/core",
"packages/utils",
"packages/web",
"examples/*"
]

# 在 workspace 中运行命令
uv run --workspace pytest # 在所有成员中运行测试

4. 跨平台一致性

UV 确保在不同操作系统上获得一致的行为:

1
2
3
4
5
# 锁定文件确保一致性
uv lock # 生成 uv.lock

# 该锁文件包含所有依赖的精确版本和哈希
# 确保团队所有成员和 CI/CD 环境使用相同的依赖

实际项目示例

让我们通过一个真实的数据科学项目来展示 UV 的工作流:

项目设置

1
2
3
4
5
6
7
8
9
10
# 1. 创建项目
uv init ml-project
cd ml-project

# 2. 添加依赖
uv add pandas scikit-learn matplotlib seaborn jupyter
uv add --dev pytest black flake8 jupyterlab

# 3. 查看项目结构
tree .

配置 pyproject.toml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
[project]
name = "ml-project"
version = "0.1.0"
description = "Machine learning project with UV"
authors = [
{name = "Your Name", email = "your.email@example.com"},
]
dependencies = [
"pandas>=2.0.0",
"scikit-learn>=1.3.0",
"matplotlib>=3.7.0",
"seaborn>=0.12.0",
"jupyter>=1.0.0",
]

[project.optional-dependencies]
dev = [
"pytest>=7.0.0",
"black>=23.0.0",
"flake8>=6.0.0",
"jupyterlab>=4.0.0",
]

[project.scripts]
train = "ml_project.main:train"
predict = "ml_project.main:predict"

[tool.uv.scripts]
test = "pytest tests/"
lint = "black --check . && flake8 ."
format = "black . && isort ."
notebook = "jupyter notebook"
lab = "jupyter lab"

[tool.black]
target-version = ['py311']
line-length = 88

[tool.flake8]
max-line-length = 88
extend-ignore = ["E203"]

开发工作流

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1. 安装所有依赖
uv install --with dev

# 2. 运行代码格式化
uv run format

# 3. 运行测试
uv run test

# 4. 训练模型
uv run train

# 5. 启动 Jupyter Lab
uv run lab

性能优化技巧

1. 利用 Docker 多层缓存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
FROM python:3.11-slim

# 安装 UV
RUN pip install uv

# 复制依赖文件
COPY pyproject.toml uv.lock ./

# 利用 UV 的快速安装
RUN uv sync --frozen --no-dev

# 复制源代码
COPY src/ ./src/

# 这样可以利用 Docker 缓存,只有在依赖变更时才重新运行 uv sync

2. CI/CD 优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# GitHub Actions 配置
name: CI with UV

on: [push, pull_request]

jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: astral-sh/setup-uv@v1
with:
version: "latest"

- name: Install dependencies
run: uv sync --all-extras --dev

- name: Run tests
run: uv run pytest --cov=./

- name: Run linting
run: uv run lint

3. 开发环境优化

1
2
3
4
5
6
7
8
# 使用 --frozen 模式确保可重现性
uv sync --frozen

# 在 CI 中使用离线模式
uv sync --offline

# 预下载常用包到缓存
uv add --dry-run numpy pandas matplotlib

最佳实践

1. 团队协作

1
2
3
4
5
# 确保团队使用相同 UV 版本
echo "uv==0.1.0" > requirements-dev.txt

# 使用一致的 Python 版本
echo "3.11" > .python-version

2. 依赖安全

1
2
3
4
5
6
7
8
9
# 定期更新依赖
uv update --all

# 检查安全漏洞
uv add safety
uv run safety check

# 锁定依赖版本
uv lock --upgrade

3. 项目结构标准化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
my-project/
├── pyproject.toml
├── uv.lock
├── .python-version
├── src/
│ └── my_project/
│ ├── __init__.py
│ └── main.py
├── tests/
│ ├── __init__.py
│ └── test_main.py
├── docs/
├── scripts/
└── .github/
└── workflows/

与其他工具对比

特性 pip + venv Poetry PDM UV
安装速度 中等 极快
依赖解析 基础 优秀
项目模板
脚本运行 需手动配置 支持 支持 原生支持
工作空间 有限 支持 完整支持
学习曲线 简单 中等 中等 简单

迁移指南

从 requirements.txt 迁移

1
2
3
4
5
6
7
8
9
10
11
# 自动迁移
uv init --from-requirements requirements.txt

# 手动创建 pyproject.toml
cat > pyproject.toml << EOF
[project]
name = "my-project"
dependencies = [
# 从 requirements.txt 复制内容
]
EOF

从 Poetry 迁移

1
2
3
4
5
6
# 自动迁移
uv init --from-poetry pyproject.toml

# 或手动调整配置
# 将 [tool.poetry] 改为 [project]
# 依赖声明格式基本兼容

总结

UV 不仅仅是一个更快的包管理器,它代表了一种 Python 开发工作流的现代化演进。通过统一项目初始化、依赖管理、虚拟环境和脚本运行,UV 为 Python 开发者提供了:

  • 极致的性能:比传统工具快 10-100 倍
  • 统一的工作流:一个工具解决所有问题
  • 现代化的体验:类似 Rust 的 Cargo 和 JavaScript 的 pnpm 的优秀设计
  • 出色的兼容性:与现有 Python 生态完美集成

无论你是开始一个新项目,还是希望优化现有项目的开发体验,UV 都值得一试。随着 Python 生态的不断发展,UV 有望成为下一代 Python 项目管理的标准工具。

开始体验 UV 吧,感受 Python 开发的极速未来!


本文基于 UV 0.1.x 版本,随着项目发展,某些命令和特性可能会有所变化。建议查阅 官方文档 获取最新信息。


Python 中的 UV:重新定义 Python 项目管理的极速利器
https://www.psnow.sbs/2025/10/11/Python-中的-UV:重新定义-Python-项目管理的极速利器/
作者
Psnow
发布于
2025年10月11日
许可协议