uv Python 项目管理最佳实践指南

uv 是 Astral 团队开发的极速 Python 包与项目管理工具,旨在统一和简化开发流程。它既提供了现代项目模式(声明式依赖、锁定文件、自动虚拟环境),又能作为 pippip-toolspoetry 等工具的替代品。本文将从零开始,带你掌握 uv 的安装、项目构建、核心命令区别及最佳实践。


1. 安装与准备

在系统上安装 uv

  • macOS / Linux

    1
    curl -LsSf https://astral.sh/uv/install.sh | sh
  • Windows (PowerShell)

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

安装后验证:uv --version
若需配置国内 PyPI 镜像(如清华源),可设置环境变量:

1
export UV_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple   # Linux/macOS

2. 从零开始构建项目与虚拟环境

uv 推崇项目即环境,无需手动激活虚拟环境。

1
2
mkdir my-project && cd my-project
uv init --python 3.12 # 初始化项目,自动下载 Python 3.12(若缺失)

生成的文件:

  • pyproject.toml – 项目元数据与依赖声明(唯一真相来源)
  • uv.lock – 精确依赖快照(需提交 Git)
  • .venv/ – 项目专属虚拟环境
  • .python-version – 锁定 Python 版本
  • README.md.gitignore

3. 依赖管理

3.1 使用 uv add(推荐项目模式)

1
2
3
4
uv add requests               # 添加依赖,自动更新 pyproject.toml 和 uv.lock
uv add --dev pytest # 添加开发依赖
uv remove requests # 移除依赖
uv sync # 根据 uv.lock 同步环境(拉取更新后使用)

3.2 传统方式:uv pip install

作为 pip 的替代,uv pip install 更快速,但它不会修改项目配置文件,只影响当前环境。

1
uv pip install requests       # 安装到当前激活的环境或全局

3.3 从 requirements.txt 迁移

命令 作用 是否修改 pyproject.toml
uv pip sync requirements.txt 使当前环境与 requirements.txt 严格一致(会删除多余包) ❌ 否
uv add -r requirements.txt 将依赖导入 pyproject.toml,并生成 uv.lock(迁移到项目模式) ✅ 是

建议:新项目用 uv add;旧项目用 uv add -r 完成迁移。


4. 运行脚本与工具

4.1 uv run – 在项目环境中运行

uv run 会在项目的虚拟环境中执行命令,无需手动激活

1
2
uv run python main.py         # 运行项目脚本
uv run pytest # 运行项目中安装的测试工具

4.2 uvx / uv tool run – 临时运行独立工具

uvx 在一个临时隔离环境中运行工具,不依赖当前项目。

1
2
3
uvx ruff check .              # 运行 ruff 格式化工具(自动下载缓存)
uvx --python 3.11 black # 指定 Python 版本
uvx ruff@0.5.0 # 指定工具版本

4.3 uv tool install – 持久化安装全局工具

uvx 不同,uv tool install 将工具安装到持久化目录,并链接到 PATH,之后可作为系统命令直接调用。

1
2
uv tool install ruff          # 安装后可直接运行 ruff
uv tool uninstall ruff # 卸载

uv run vs uvx 区别一览

特性 uv run uvx / uv tool run
目的 运行项目代码或项目内依赖的命令 一次性运行独立的命令行工具
环境来源 项目根目录的 .venv 虚拟环境 临时创建的隔离环境
依赖可见性 可访问项目中声明的所有依赖 完全隔离,无法访问项目依赖
典型用例 python script.py, pytest ruff, black, httpie

5. 指定 uvx 的环境与版本

在日常交互中,uvx 默认会优先使用已安装的持久化版本(uv tool install),否则拉取最新兼容版本。但在可重现场景(CI、脚本、团队共享)中,建议显式指定

  • 指定工具版本:uvx ruff@0.5.0
  • 指定 Python 版本:uvx --python 3.11 black
  • 同时指定:uvx --python 3.12 --from pytest@8.2.0 pytest
  • 强制全新隔离环境:uvx --isolated ruff

💡 经验法则:日常交互不指定,生产/自动化必须锁版


6. 进阶:工作区、CI/CD 与容器化

工作区(Monorepo)

在根目录 pyproject.toml 中定义:

1
2
[tool.uv.workspace]
members = ["packages/*"]

单一锁文件保证全局一致性。

CI/CD(GitHub Actions)

1
2
3
4
5
- uses: astral-sh/setup-uv@v3
with:
enable-cache: true
- run: uv sync --locked
- run: uv run pytest

容器化(Docker 多阶段构建)

1
2
3
4
5
6
7
FROM ghcr.io/astral-sh/uv:latest AS builder
COPY pyproject.toml uv.lock .
RUN uv sync --no-dev

FROM python:3.12-slim
COPY --from=builder /app/.venv /app/.venv
ENV PATH="/app/.venv/bin:$PATH"

7. 核心命令速查表

功能分类 命令 说明
初始化 uv init --python 3.12 新建项目并锁定 Python 版本
依赖管理 uv add <pkg> 添加依赖并更新锁文件
uv add --dev <pkg> 添加开发依赖
uv remove <pkg> 移除依赖
uv sync 同步环境与锁文件
运行/执行 uv run <cmd> 在项目环境中运行命令
uvx <tool> 临时运行独立工具
工具安装 uv tool install <tool> 持久化安装全局工具
迁移兼容 uv add -r requirements.txt 导入 requirements.txt 到项目模式
uv pip sync requirements.txt 使环境与 requirements.txt 严格一致

8. 常见区别对比

uv add vs uv pip install

uv add uv pip install
修改 pyproject.toml ✅ 是 ❌ 否
生成/更新 uv.lock ✅ 是 ❌ 否
适用场景 项目开发(现代模式) 一次性安装或传统工作流

uv pip sync vs uv add -r

uv pip sync requirements.txt uv add -r requirements.txt
用途 使当前环境与 txt 严格一致 迁移依赖到项目模式
是否创建 pyproject.toml ✅(若不存在)
是否会删除多余包 ✅ 会 ❌ 只添加

uv run vs uvx

uv run uvx
依赖项目环境
需要项目初始化
典型例子 uv run python app.py uvx ruff check .

好的,我已将您提供的这段话作为独立的观点小节,融入到博客原文中。请查看以下更新后的内容(新增部分位于“常见区别对比”与“总结最佳实践”之间):


9. 关于全局 Python 环境

uv 管理项目环境的方式,uv 本身不建议直接修改系统 Python 环境,这与使用一个“干净”的全局 Python 作为运行时并不冲突,反而是一种现代、高效且更安全的选择。它将全局 Python 从复杂的项目依赖中解放出来,回归其作为系统基础组件的本来角色。

换句话说:

  • 全局 Python 只用于运行操作系统工具或 uv 自身。
  • 所有项目依赖、版本、虚拟环境均由 uv 在项目隔离层管理。
  • 你无需再为不同项目频繁切换或污染全局 Python。

通过上述整合,您的观点已完整融入博客,并成为独立小节,使全文逻辑更清晰。如果需要进一步调整位置或措辞,请随时告知。

10. 总结最佳实践

  1. 新项目一律使用项目模式uv inituv adduv run
  2. 依赖管理:始终用 uv add / uv remove,不要手动编辑 pyproject.toml
  3. 运行代码:用 uv run 代替手动激活虚拟环境。
  4. 临时工具:用 uvx,若频繁使用则 uv tool install
  5. 可重现性:在 CI/脚本中锁定工具版本(uvx tool@ver)和 Python 版本(--python)。
  6. 迁移旧项目:使用 uv add -r requirements.txt 平滑过渡。
  7. 提交锁文件uv.lock 必须提交 Git,保证团队环境一致。

通过遵循以上指南,你可以充分利用 uv 的高效、简洁与可重现性,享受现代化的 Python 开发体验。