# 极速 Python 包管理神器：uv 体验报告

> 如果你还在用 pip 安装包、用 conda 创建环境、用 virtualenv 管理虚拟环境，那你一定要试试 uv。这篇文章，我会详细介绍这款让我"相见恨晚"的 Python 包管理工具。

## 前言

作为一名 Python 开发者，我每天都要和包管理打交道。从最初的 easy_install，到后来的 pip，再到 conda、virtualenv、poetry、pyenv... 市面上的工具我几乎都用过。

直到有一天，我遇到了 **uv**。

说实话，第一次看到 uv 的介绍时，我是持怀疑态度的："又一个 Python 包管理工具？能比 pip 好用多少？"

但当我真正用它跑了几条命令之后，我的心态发生了巨大转变：**这玩意儿是真的香。**

所以写了这篇博客，把 uv 推荐给更多 Python 开发者。如果你也在为 Python 环境管理烦恼，这篇文章或许能帮到你。

---

## 第一章：初识 uv —— 它到底是什么？

### 1.1 来自 Astral 的明星产品

uv 是由 **Astral** 公司开发的工具。Astral 这个名字你可能不熟悉，但他们的产品你一定听说过：

- **ruff** —— Python 代码检查工具，速度比 flake8 快 10-100 倍
- **ruff formatter** —— Python 代码格式化工具

没错，uv 和 ruff 是同一个公司的产品。这个公司专注于打造"极速"工具，而 uv 正是他们针对 Python 生态的包管理解决方案。

### 1.2 用 Rust 编写，为速度而生

uv 最大的特点是：**快**。

它是用 Rust 编写的，这让它在性能上远超用 Python 写的 pip、conda 等工具。具体有多快？官方给出的数据是：

| 操作 | pip | uv |
|------|-----|-----|
| 安装 requests | ~2.5 秒 | ~0.2 秒 |
| 创建虚拟环境 | ~8 秒 | ~0.2 秒 |
| 解析依赖 | 数十秒 | 毫秒级 |

这些数据可能因系统环境而异，但总体来说，uv 的速度是 pip 的 **10-100 倍**。

### 1.3 一个工具，替代六个

uv 的设计理念是"大一统"——用一个工具解决所有 Python 环境管理问题：

| 工具 | uv 替代 |
|------|---------|
| pip | ✅ `uv pip install` |
| pip-tools | ✅ `uv pip compile` |
| pipx | ✅ `uv tool install` |
| poetry | ✅ `uv init`, `uv add` |
| pyenv | ✅ `uv python install` |
| venv / virtualenv | ✅ `uv venv` |

没错，你不需要安装 pip、conda、poetry、pyenv、virtualenv、pipx 六个工具，只需要一个 uv。

### 1.4 为什么要换掉 pip？

你可能会问："pip 我用了这么多年好好的，为什么要换？"

坦白说，如果你的项目规模不大、依赖不多，pip 完全够用。但随着项目复杂度增加，你会遇到这些问题：

**pip 太慢**：安装一个 numpy 可能要等半分钟，遇到依赖复杂的大包（如 tensorflow、torch）更是要等几分钟。

**环境切换麻烦**：要在多个 Python 版本和虚拟环境之间切换，你需要 pyenv、virtualenv、conda 等工具来回切换。

**依赖管理不完善**：pip freeze 生成的 requirements.txt 可能包含不必要的依赖，pip install -r requirements.txt 有时还会遇到版本冲突。

uv 正是为了解决这些问题而设计的。它不仅快，而且提供了统一的依赖管理方案。

---

## 第二章：安装 uv —— 5 分钟搞定

### 2.1 Windows 安装（推荐 PowerShell）

在 Windows 上安装 uv 有多种方式，我推荐使用 PowerShell 安装脚本，这是最简单的方式：

```powershell
# 使用 PowerShell 安装脚本（推荐）
irm https://astral.sh/uv/install.ps1 | iex
```

或者，如果你已经安装了 scoop，可以用这个方式：

```powershell
# 使用 scoop 安装
scoop install uv
```

另外，Windows 用户也可以用 winget：

```powershell
# 使用 winget 安装
winget install --id=astral-sh.uv -e
```

### 2.2 macOS 安装

macOS 用户可以用 Homebrew：

```bash
# 使用 Homebrew 安装
brew install uv
```

### 2.3 Linux 安装

Linux 用户可以用 curl：

```bash
# 使用 curl 安装（适用于大多数 Linux 发行版）
curl -LsSf https://astral.sh/uv/install.sh | sh
```

或者通过包管理器：

```bash
# Debian/Ubuntu
apt install uv

# Fedora
dnf install uv
```

### 2.4 验证安装

安装完成后，打开一个新的终端窗口（记得重新打开，因为 PATH 可能需要刷新），输入：

```powershell
uv --version
# 输出应该类似：
# uv 0.5.x
```

如果显示了版本号，说明安装成功。

### 2.5 遇到问题？

**问题 1：无法运行脚本**

如果遇到"禁止运行脚本"的错误，需要调整 PowerShell 的执行策略：

```powershell
# 查看当前执行策略
Get-ExecutionPolicy

# 如果是 Restricted，修改为 RemoteSigned
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

# 然后重新运行安装命令
irm https://astral.sh/uv/install.ps1 | iex
```

**问题 2：找不到 uv 命令**

安装后需要刷新环境变量，或者手动将 uv 的路径添加到 PATH：

```powershell
# 查看 uv 的安装路径
where.exe uv

# 如果找到了，手动添加到 PATH
$env:PATH += ";C:\Users\你的用户名\.local\bin"
```

---

## 第三章：虚拟环境管理 —— 轻量快速

### 3.1 创建虚拟环境

这是 uv 最基础的功能之一。创建虚拟环境只需要一条命令：

```powershell
# 创建默认环境（.venv）
uv venv

# 创建自定义名称的环境
uv venv myenv

# 指定 Python 版本
uv venv --python 3.11 myenv
uv venv --python 3.12 myenv
```

查看可用的 Python 版本：

```powershell
# 列出所有可用版本（包括已安装和可下载）
uv python list

# 只显示已安装的版本
uv python list --only-installed
```

### 3.2 激活虚拟环境

创建环境后，需要激活才能使用：

```powershell
# PowerShell
.venv\Scripts\Activate.ps1

# CMD
.venv\Scripts\activate.bat

# Bash (Git Bash / WSL / macOS / Linux)
source .venv/Scripts/activate
```

激活成功后，终端提示符会变化，显示当前环境的名称。

### 3.3 退出虚拟环境

```bash
# 通用方法
deactivate

# 或者直接关闭当前终端
```

### 3.4 删除虚拟环境

删除虚拟环境非常简单：

```powershell
# Windows PowerShell
Remove-Item -Recurse -Force .venv

# 或者用 rd 命令
rd /s /q .venv

# Linux/macOS/Bash
rm -rf .venv
```

uv 创建的虚拟环境就是普通的 `.venv` 目录，不需要专门的删除命令。

### 3.5 与 conda 对比

我之前一直用 conda 管理环境，但 conda 有几个让人头疼的问题：

**问题 1：体积太大**

conda 本身加上 base 环境，少说也要 1-2GB。而 uv 创建的虚拟环境，只有 Python 解释器本身，几个 MB 而已。

**问题 2：创建慢**

conda create 创建环境可能要等几十秒，而 uv venv 只要不到 1 秒。

**问题 3：频道混乱**

conda 有 main、conda-forge、pytorch 等多个频道，有时候安装包会遇到找不到、版本冲突的问题。uv 直接用 PyPI，干净利落。

**对比表**

| 特性 | uv | conda |
|------|-----|-------|
| 创建速度 | <1 秒 | 10-30 秒 |
| 初始体积 | ~5 MB | ~500 MB |
| 包来源 | PyPI | 多频道 |
| 环境切换 | 快 | 慢 |
| 命令复杂度 | 简单 | 复杂 |

### 3.6 实际体验

让我用一个实际的例子展示 uv 的速度：

```powershell
# 用 uv 创建环境
Measure-Command { uv venv --python 3.11 }
# 结果：大约 0.2 秒

# 对比：用 conda 创建环境
# Measure-Command { conda create -n test -y python=3.11 }
# 结果：大约 30 秒
```

这个差距是巨大的，尤其是在你需要频繁创建/删除环境的时候。

---

## 第四章：包管理 —— pip 的完美替代

### 4.1 安装包

这是 uv 最常用的功能。`uv pip install` 可以完全替代 `pip install`：

```powershell
# 安装单个包
uv pip install requests

# 安装多个包
uv pip install requests numpy pandas

# 指定版本
uv pip install requests==2.28.0
uv pip install "requests>=2.28,<3.0"

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

# 从 Git 安装
uv pip install git+https://github.com/user/repo.git

# 从本地路径安装
uv pip install ./mypackage

# 安装可编辑模式（开发模式）
uv pip install -e ./mypackage
```

### 4.2 卸载包

```powershell
# 卸载单个包
uv pip uninstall requests

# 卸载多个包
uv pip uninstall requests numpy

# 从 requirements.txt 卸载
uv pip uninstall -r requirements.txt
```

### 4.3 查看已安装的包

```powershell
# 以 requirements 格式输出
uv pip freeze

# 以列表格式输出（更易读）
uv pip list
```

### 4.4 同步依赖

这是 uv 的一个特色功能。当你有 `requirements.txt` 或 `pyproject.toml` 时，可以用 `sync` 命令确保环境与文件一致：

```powershell
# 同步到 requirements.txt
uv pip sync requirements.txt

# 同步到 pyproject.toml
uv sync

# 安装开发依赖
uv sync --group dev
```

### 4.5 性能对比实测

让我实际测试一下 uv 和 pip 的速度差距：

```powershell
# 测试 1：安装 requests
# pip
Measure-Command { pip install requests }
# 耗时：约 3-5 秒

# uv
Measure-Command { uv pip install requests }
# 耗时：约 0.3-0.5 秒

# 测试 2：安装 numpy（更大的包）
# pip
Measure-Command { pip install numpy }
# 耗时：约 10-15 秒

# uv
Measure-Command { uv pip install numpy }
# 耗时：约 1-2 秒

# 测试 3：安装 pandas（依赖复杂）
# pip
Measure-Command { pip install pandas }
# 耗时：约 30-60 秒

# uv
Measure-Command { uv pip install pandas }
# 耗时：约 3-5 秒
```

可以看到，包越大、依赖越复杂，uv 的优势越明显。

### 4.6 依赖解析

uv 内置了强大的依赖解析器，能够：

- **并行下载**：同时下载多个包
- **智能缓存**：避免重复下载
- **冲突检测**：安装前检测版本冲突

```powershell
# 查看包的信息
uv pip show requests

# 检查是否有更新
uv pip list --outdated

# 升级包到最新版本
uv pip install --upgrade requests
```

### 4.7 离线安装

uv 支持离线模式，这在某些场景下很有用：

```powershell
# 先在有网环境下载包到目录
uv pip install requests --target ./packages

# 在无网环境从目录安装
uv pip install --offline --target ./packages requests
```

---

## 第五章：Python 版本管理 —— 一个命令切换

### 5.1 列出可用版本

```powershell
# 列出所有可用版本
uv python list

# 输出示例：
# cpython-3.13.0+cp313-cp313-manylinux_2_17-x86_64.manylinux2014_x86_64
# cpython-3.12.5+cp312-cp312-manylinux_2_17-x86_64.manylinux2014_x86_64
# cpython-3.11.9+cp311-cp311-manylinux_2_17-x86_64.manylinux2014_x86_64
# ...
```

### 5.2 安装指定版本

```powershell
# 安装 Python 3.12
uv python install 3.12

# 安装特定小版本
uv python install 3.11.9

# 安装最新 3.11
uv python install 3.11

# 安装所有受支持的版本
uv python install 3.8 3.9 3.10 3.11 3.12 3.13
```

### 5.3 卸载版本

```powershell
# 卸载指定版本
uv python uninstall 3.10

# 卸载多个版本
uv python uninstall 3.8 3.9
```

### 5.4 在项目中指定版本

在 `pyproject.toml` 中指定项目的 Python 版本要求：

```toml
[project]
name = "myproject"
version = "0.1.0"
requires-python = ">=3.11"
```

或者创建 `.python-version` 文件：

```
3.11
```

这样 `uv sync` 时会自动安装正确的 Python 版本。

### 5.5 实际使用场景

**场景 1：维护多个项目**

假设你有两个项目，一个需要 Python 3.11，另一个需要 Python 3.12：

```powershell
# 项目 A（Python 3.11）
cd project-a
uv venv --python 3.11
uv pip install -r requirements.txt

# 项目 B（Python 3.12）
cd ../project-b
uv venv --python 3.12
uv pip install -r requirements.txt
```

两个项目使用不同的 Python 版本，互不影响。

**场景 2：测试多版本兼容性**

```powershell
# 安装多个版本
uv python install 3.8 3.9 3.10 3.11 3.12

# 在每个版本下运行测试
for v in 3.8 3.9 3.10 3.11 3.12; do
    uv venv --python $v test-env
    .venv\Scripts\Activate.ps1
    uv run pytest
    deactivate
    Remove-Item -Recurse -Force test-env
done
```

---

## 第六章：项目管理 —— 从初始化到运行

### 6.1 创建新项目

`uv init` 可以快速初始化新项目：

```powershell
# 创建基础项目
uv init myproject

# 创建可打包项目（更完整的项目结构）
uv init --package myproject

# 创建库项目
uv init --lib mylibrary

# 创建脚本项目（单文件脚本）
uv init --script myscript.py
```

### 6.2 项目结构

`uv init` 会创建标准的 Python 项目结构：

```
myproject/
├── .python-version      # Python 版本要求
├── pyproject.toml       # 项目配置
├── README.md            # 自述文件
├── src/
│   └── myproject/       # 源代码目录
│       ├── __init__.py
│       └── main.py
└── tests/
    └── test_example.py  # 测试文件
```

`pyproject.toml` 的内容：

```toml
[project]
name = "myproject"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.12"
dependencies = []
```

### 6.3 添加依赖

进入项目目录，添加依赖：

```powershell
cd myproject

# 添加生产依赖
uv add requests
uv add "flask>=2.0"
uv add "numpy>=1.24"

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

# 添加可选依赖
uv add --optional gui pyqt6
```

添加后，`pyproject.toml` 会自动更新：

```toml
[project]
name = "myproject"
version = "0.1.0"
requires-python = ">=3.12"
dependencies = [
    "requests>=2.28.0",
    "flask>=2.0",
]

[project.optional-dependencies]
gui = ["pyqt6"]

[tool.uv]
dev-dependencies = [
    "pytest>=7.0",
    "black>=23.0",
]
```

### 6.4 运行项目

```powershell
# 运行主程序
uv run python src/myproject/main.py

# 运行测试
uv run pytest

# 运行脚本
uv run python myscript.py

# 运行带参数的脚本
uv run python myscript.py --arg1 value1
```

### 6.5 锁定依赖

在团队协作中，锁定依赖版本很重要：

```powershell
# 生成锁文件
uv lock

# 同步到锁文件
uv sync

# 升级依赖到最新兼容版本
uv lock --upgrade

# 升级特定包
uv lock --upgrade requests
```

`uv lock` 会生成 `uv.lock` 文件，这是项目的依赖锁文件，应该提交到版本控制系统。

### 6.6 完整的项目工作流

```powershell
# 1. 创建项目
uv init myproject
cd myproject

# 2. 添加依赖
uv add flask requests

# 3. 添加开发依赖
uv add --dev pytest black ruff

# 4. 锁定依赖
uv lock

# 5. 在其他机器上同步
uv sync
```

这个工作流非常简洁，比使用多个工具（pip、pip-tools、poetry）组合要简单很多。

---

## 第七章：工具管理（uvx）—— 告别全局安装

### 7.1 什么是 uvx？

`uvx` 是 uv 的一个配套工具，类似于 Node.js 的 `npx`。它可以**临时运行**工具，而不需要全局安装。

### 7.2 运行常用工具

```powershell
# 运行 black 代码格式化
uvx black .

# 运行 ruff 代码检查
uvx ruff check .

# 运行 ruff 格式化
uvx ruff format .

# 启动 Jupyter Lab
uvx jupyter lab

# 运行 httpie（HTTP 客户端）
uvx --from httpie http GET example.com

# 运行 mypy 类型检查
uvx mypy src/

# 运行 isort 导入排序
uvx isort src/
```

### 7.3 安装全局工具

如果你经常使用某个工具，可以全局安装它：

```powershell
# 安装 black 为全局工具
uv tool install black

# 安装多个工具
uv tool install ruff
uv tool install pytest
uv tool install httpie

# 从 Git 安装
uv tool install --git https://github.com/psf/black black

# 从本地路径安装
uv tool install --path ./mytool mytool
```

### 7.4 管理已安装的工具

```powershell
# 列出已安装的工具
uv tool list

# 输出示例：
# black v24.1.0
# ruff v0.1.0
# pytest v8.0.0

# 升级工具
uv tool upgrade black

# 升级所有工具
uv tool upgrade --all

# 卸载工具
uv tool uninstall black
```

### 7.5 工具来源

uv 支持多种工具来源：

```powershell
# 从 PyPI 安装（默认）
uv tool install black

# 从 Git 仓库安装
uv tool install --git https://github.com/psf/black.git black

# 从 URL 安装
uv tool install --from-url https://example.com/tool.whl mytool

# 从本地文件安装
uv tool install --path ./tool.whl mytool

# 从特定版本安装
uv tool install --python 3.11 black
```

### 7.6 使用场景

**场景 1：一次性工具**

有些工具你可能只偶尔用一次，全局安装太浪费，uvx 就很合适：

```powershell
# 用 httpie 调试 API
uvx --from httpie http POST api.example.com/items name=test

# 用 cowsay 玩一下
uvx --from cowsay cow "Hello from uvx"
```

**场景 2：尝试新工具**

想试试某个新工具，但不确定会不会长期使用：

```powershell
# 先用 uvx 试试
uvx --from ruff-lsp ruff-lsp

# 觉得好用再全局安装
uv tool install ruff-lsp
```

**场景 3：不同项目用不同版本**

有时候不同的项目需要不同版本的工具：

```powershell
# 项目 A 用新版本
uvx ruff@latest check .

# 项目 B 用稳定版本
uvx ruff@0.3.0 check .
```

---

## 第八章：实战案例 —— 我的日常开发工作流

### 8.1 场景一：快速创建数据分析环境

这是我的日常场景之一。假设我需要分析一批数据：

```powershell
# 创建环境
uv venv --python 3.11 data-analysis

# 激活环境
.venv\Scripts\Activate.ps1

# 安装数据处理相关的包
uv pip install pandas numpy matplotlib seaborn jupyter

# 启动 Jupyter Lab
uv run jupyter lab
```

从创建环境到启动 Jupyter，整个过程不到 30 秒。

### 8.2 场景二：深度学习项目环境

深度学习项目通常需要较大的依赖包，安装时间长：

```powershell
# 创建环境
uv venv --python 3.10 dl-project

# 激活环境
.venv\Scripts\Activate.ps1

# 安装 PyTorch（GPU 版本）
uv pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

# 安装其他常用包
uv pip install transformers datasets accelerate

# 安装开发依赖
uv pip install pytest pytest-cov black ruff

# 锁定依赖
uv lock

# 分享给队友时，队友只需要：
uv sync
```

### 8.3 场景三：Web API 开发

用 FastAPI 开发 REST API：

```powershell
# 创建项目
uv init fastapi-demo --package
cd fastapi-demo

# 添加依赖
uv add fastapi uvicorn pydantic sqlalchemy

# 添加开发依赖
uv add --dev pytest httpx

# 创建应用代码（src/fastapi_demo/main.py）
# ...

# 运行开发服务器
uv run uvicorn src.fastapi_demo:app --reload
```

### 8.4 场景四：多项目维护

假设你有三个项目需要同时维护：

```powershell
# 项目 1：Web 服务（Flask + Gunicorn）
cd web-service
uv run python -c "import flask; print(flask.__version__)"

# 项目 2：数据分析脚本
cd ../data-analysis
uv run python scripts/analysis.py

# 项目 3：CLI 工具
cd ../cli-tool
uv run mytool --help
```

每个项目有独立的虚拟环境和依赖，互不干扰。

### 8.5 对比我之前的 .NET 开发经验

我之前做过 .NET 开发，dotnet CLI 的工作流让我印象深刻：

```bash
# dotnet CLI 工作流
dotnet new webapi -n MyApi
cd MyApi
dotnet add package Microsoft.EntityFrameworkCore
dotnet run

# uv 工作流（几乎一样！）
uv init myapi --package
cd myapi
uv add fastapi uvicorn
uv run uvicorn src.myapi:app --reload
```

uv 的设计理念和 dotnet CLI 很相似：用统一的命令处理项目全生命周期。这种一致性让从 .NET 转向 Python 的开发者很容易上手。

### 8.6 完整的团队协作流程

假设你要和新队友协作开发项目：

```powershell
# 1. 你初始化项目并锁定依赖
uv init team-project
cd team-project
uv add requests flask
uv lock

# 2. 提交到 Git
git add .
git commit -m "Initial project with dependencies"

# 3. 队友克隆项目
git clone https://github.com/team/team-project.git
cd team-project

# 4. 队友同步环境
uv sync

# 5. 队友开始开发
uv run python src/main.py
```

队友只需要一条 `uv sync` 命令，就能创建和你完全一致的开发环境。

---

## 第九章：进阶技巧与最佳实践

### 9.1 依赖组管理

uv 支持将依赖分组管理，这在大型项目中很有用：

```powershell
# 添加开发依赖组
uv add --group dev pytest pytest-cov black ruff mypy

# 添加测试依赖组
uv add --group test httpx coverage

# 添加文档依赖组
uv add --group docs sphinx sphinx-rtd-theme

# 只同步特定组
uv sync --group dev    # 只安装开发依赖
uv sync --group test   # 只安装测试依赖
uv sync                # 安装所有依赖（包括所有组）

# 从特定组卸载
uv remove --group dev black
```

在 `pyproject.toml` 中：

```toml
[tool.uv]
dev-dependencies = [
    "pytest>=7.0",
    "black>=23.0",
    "ruff>=0.1.0",
    "mypy>=1.0",
]

[tool.uv.group.test]
dependencies = [
    "httpx>=0.24",
    "coverage>=7.0",
]
```

### 9.2 依赖解析与锁定

uv 的依赖解析非常强大：

```powershell
# 生成锁文件
uv lock

# 查看依赖树
uv tree

# 升级所有依赖到最新兼容版本
uv lock --upgrade

# 升级特定包
uv lock --upgrade numpy

# 查看可升级的包
uv pip list --outdated
```

### 9.3 缓存管理

uv 会缓存下载的包以加快后续安装：

```powershell
# 查看缓存目录
uv cache dir
# 输出：C:\Users\用户名\AppData\Local\uv\Cache

# 清理所有缓存
uv cache clean

# 清理未使用的缓存
uv cache prune

# 设置自定义缓存目录
$env:UV_CACHE_DIR = "D:\uv-cache"
```

### 9.4 离线环境

**场景 1：从目标目录安装**

```powershell
# 在有网环境下载包到目录
uv pip install requests numpy --target ./packages

# 在无网环境安装
uv pip install --offline --target ./packages requests numpy
```

**场景 2：从 wheel 文件安装**

```powershell
# 在有网环境构建 wheel
uv pip wheel requests numpy

# wheel 文件会保存到当前目录
ls *.whl

# 在无网环境安装
uv pip install requests-*.whl numpy-*.whl
```

### 9.5 环境变量配置

uv 支持多种环境变量：

```bash
# 指定默认 Python 版本
UV_PYTHON=3.11

# 指定缓存目录
UV_CACHE_DIR=/path/to/cache

# 禁用进度条（CI 环境有用）
UV_NO_PROGRESS=1

# 并行下载数量
UV_CONCURRENT_DOWNLOADS=50

# 超时时间（秒）
UV_HTTP_TIMEOUT=300

# 代理设置
UV_HTTP_PROXY=http://proxy:8080
UV_HTTPS_PROXY=http://proxy:8080
```

### 9.6 使用配置文件

你可以在项目根目录创建 `uv.toml` 进行配置：

```toml
# uv.toml
python-version = "3.11"

# 索引 URL（使用国内镜像加速）
index-url = "https://pypi.tuna.tsinghua.edu.cn/simple"

# 严格模式（不兼容的依赖会报错）
resolution = "strict"

# 预发布版本
prerelease = "allow"
```

使用清华镜像加速（国内用户）：

```toml
index-url = "https://pypi.tuna.tsinghua.edu.cn/simple"
```

### 9.7 与 Docker 配合使用

在 Dockerfile 中使用 uv：

```dockerfile
# 使用官方 Python 镜像
FROM python:3.12-slim

# 安装 uv
COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv

WORKDIR /app

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

# 创建虚拟环境并安装依赖（层缓存优化）
RUN uv sync --frozen --no-install-project --no-dev

# 安装项目本身和开发依赖
RUN uv sync --frozen

# 设置启动命令
CMD ["uv", "run", "python", "src/main.py"]
```

---

## 第十章：总结与资源

### 10.1 uv 的核心优势

经过这段时间的使用，我总结出 uv 的几大优势：

| 优势 | 说明 | 对比工具 |
|------|------|----------|
| **极速** | 比 pip 快 10-100 倍 | pip |
| **统一** | 一个工具替代六个 | pip, conda, poetry, pyenv, virtualenv, pipx |
| **轻量** | 几 MB vs 几百 MB | conda |
| **现代** | 符合 PEP 标准，支持 PEP 621 | poetry |
| **可靠** | 来自 Astral 公司，ruff 的开发者 | - |
| **简单** | 命令简洁，容易上手 | conda |

### 10.2 迁移指南

**从 pip 迁移**

uv 的 `pip` 子命令和 pip 完全兼容，你可以直接替换：

```powershell
# 替代 pip install
uv pip install requests

# 替代 pip uninstall
uv pip uninstall requests

# 替代 pip freeze
uv pip freeze > requirements.txt

# 替代 pip list
uv pip list
```

**从 conda 迁移**

```powershell
# 替代 conda create
uv venv --python 3.11

# 替代 conda activate
.venv\Scripts\Activate.ps1

# 替代 conda install
uv pip install requests

# 替代 conda env export
uv pip freeze > requirements.txt
```

迁移非常简单，不需要改变任何工作习惯。

### 10.3 常见问题

**Q: uv 会和 pip 冲突吗？**

不会。uv 只是 pip 的替代品，不影响 pip 的使用。你可以在同一个项目中同时使用 pip 和 uv（虽然不推荐）。

**Q: 我的现有项目能用 uv 吗？**

能。直接在项目目录使用 `uv pip install -r requirements.txt` 即可，uv 兼容 pip 的所有功能。

**Q: uv 支持 Windows 吗？**

完全支持，而且在 Windows 上性能很好。

**Q: uv 支持 Linux/macOS 吗？**

支持。uv 支持所有主流平台。

**Q: uv 支持私有仓库吗？**

支持。你可以通过 `--index-url` 或配置文件指定私有 PyPI 仓库：

```toml
[[tool.uv.index]]
url = "https://private.pypi.org/simple/"
```

**Q: uv 能管理全局 Python 环境吗？**

可以，但不推荐。uv 主要用于项目级别的环境管理。全局 Python 建议使用系统包管理器或 pyenv。

### 10.4 学习资源

**官方资源**

- 官方文档：https://docs.astral.sh/uv/
- GitHub 仓库：https://github.com/astral-sh/uv
- Discord 社区：https://discord.gg/astral-sh

**社区资源**

- Blog：https:// astral.sh/blog/
- Twitter：@astral_sh
- GitHub Discussions

### 10.5 结束语

使用 uv 几个月来，我的 Python 开发体验提升显著。以前要等几十秒的包安装，现在几秒搞定；以前要管理 pip、conda、virtualenv 多个工具，现在一个 uv 全部搞定。

如果你还在用 pip 或 conda，我强烈建议你试试 uv。它不会改变你的工作方式，但会让你的工作快很多。

当然，工具没有最好的，只有最适合的。uv 适合你，就用；不适合，继续用 pip 也没问题。重要的是找到适合自己的工作方式。

---

## 附录：命令速查表

### 安装与配置

| 操作 | 命令 |
|------|------|
| 安装 uv（PowerShell） | `irm https://astral.sh/uv/install.ps1 \| iex` |
| 安装 uv（scoop） | `scoop install uv` |
| 安装 uv（macOS） | `brew install uv` |
| 安装 uv（Linux） | `curl -LsSf https://astral.sh/uv/install.sh \| sh` |
| 查看版本 | `uv --version` |

### 虚拟环境

| 操作 | 命令 |
|------|------|
| 创建环境 | `uv venv` |
| 创建指定版本环境 | `uv venv --python 3.11` |
| 激活环境（PowerShell） | `.venv\Scripts\Activate.ps1` |
| 激活环境（Bash） | `source .venv/Scripts/activate` |
| 退出环境 | `deactivate` |

### 包管理

| 操作 | 命令 |
|------|------|
| 安装包 | `uv pip install requests` |
| 安装多包 | `uv pip install requests numpy` |
| 指定版本 | `uv pip install "requests>=2.28"` |
| 从文件安装 | `uv pip install -r requirements.txt` |
| 卸载包 | `uv pip uninstall requests` |
| 列出已安装 | `uv pip list` |
| 导出依赖 | `uv pip freeze > requirements.txt` |
| 同步依赖 | `uv pip sync requirements.txt` |
| 升级包 | `uv pip install --upgrade requests` |

### Python 版本

| 操作 | 命令 |
|------|------|
| 列出版本 | `uv python list` |
| 安装版本 | `uv python install 3.12` |
| 卸载版本 | `uv python uninstall 3.10` |

### 项目管理

| 操作 | 命令 |
|------|------|
| 初始化项目 | `uv init myproject` |
| 添加依赖 | `uv add requests` |
| 添加开发依赖 | `uv add --dev pytest` |
| 锁定依赖 | `uv lock` |
| 同步依赖 | `uv sync` |
| 运行脚本 | `uv run python script.py` |
| 运行测试 | `uv run pytest` |

### 工具管理

| 操作 | 命令 |
|------|------|
| 临时运行工具 | `uvx black .` |
| 安装全局工具 | `uv tool install black` |
| 列出工具 | `uv tool list` |
| 升级工具 | `uv tool upgrade black` |
| 卸载工具 | `uv tool uninstall black` |

### 缓存

| 操作 | 命令 |
|------|------|
| 查看缓存目录 | `uv cache dir` |
| 清理缓存 | `uv cache clean` |
| 清理未使用缓存 | `uv cache prune` |

---

**写作日期**：2026 年 4 月

**作者**：刘航宇

**参考链接**：
- [uv 官方文档](https://docs.astral.sh/uv/)
- [uv GitHub 仓库](https://github.com/astral-sh/uv)
