1322 lines
28 KiB
Markdown
1322 lines
28 KiB
Markdown
# 极速 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)
|