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
brew install uv
|
Windows:
1 2 3 4 5
| powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
winget install astral.uv
|
使用 pip 安装(跨平台):
验证安装
安装完成后,验证 UV 是否正确安装:
1 2 3 4
| uv --version
uv --help
|
升级 UV
1 2 3 4 5
| uv self update
pip install --upgrade uv
|
核心功能详解
1. 项目初始化
创建新项目:
1 2 3
| 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
uv init --from-requirements requirements.txt
uv init --from-poetry pyproject.toml
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
| uv venv
uv venv --path custom-venv
uv venv --python 3.11
source .venv/bin/activate
.venv\Scripts\activate
uv run python script.py uv run pytest
|
虚拟环境的最佳实践:
1 2 3 4 5
| echo ".venv/" >> .gitignore
|
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
uv remove requests uv remove -d pytest
|
依赖同步和锁定
1 2 3 4 5 6 7 8 9 10 11
| uv install
uv sync
uv pip freeze > 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
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
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
| [project] name = "my-workspace"
[tool.uv.workspace] members = [ "packages/core", "packages/utils", "packages/web", "examples/*" ]
uv run --workspace pytest
|
4. 跨平台一致性
UV 确保在不同操作系统上获得一致的行为:
实际项目示例
让我们通过一个真实的数据科学项目来展示 UV 的工作流:
项目设置
1 2 3 4 5 6 7 8 9 10
| uv init ml-project cd ml-project
uv add pandas scikit-learn matplotlib seaborn jupyter uv add --dev pytest black flake8 jupyterlab
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
| uv install --with dev
uv run format
uv run test
uv run train
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
RUN pip install uv
COPY pyproject.toml uv.lock ./
RUN uv sync --frozen --no-dev
COPY src/ ./src/
|
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
| 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
| uv sync --frozen
uv sync --offline
uv add --dry-run numpy pandas matplotlib
|
最佳实践
1. 团队协作
1 2 3 4 5
| echo "uv==0.1.0" > requirements-dev.txt
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
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
|
总结
UV 不仅仅是一个更快的包管理器,它代表了一种 Python 开发工作流的现代化演进。通过统一项目初始化、依赖管理、虚拟环境和脚本运行,UV 为 Python 开发者提供了:
- 极致的性能:比传统工具快 10-100 倍
- 统一的工作流:一个工具解决所有问题
- 现代化的体验:类似 Rust 的 Cargo 和 JavaScript 的 pnpm 的优秀设计
- 出色的兼容性:与现有 Python 生态完美集成
无论你是开始一个新项目,还是希望优化现有项目的开发体验,UV 都值得一试。随着 Python 生态的不断发展,UV 有望成为下一代 Python 项目管理的标准工具。
开始体验 UV 吧,感受 Python 开发的极速未来!
本文基于 UV 0.1.x 版本,随着项目发展,某些命令和特性可能会有所变化。建议查阅 官方文档 获取最新信息。