Python 包管理工具 uv:告别 pip 的慢与痛

一、问题:pip 到底哪里让人不爽?

作为一个 Python 开发者,你一定经历过这些场景:

  • 安装依赖慢如蜗牛 —— pip install 一个大型项目,喝完一杯咖啡还没装完
  • 工具链碎片化严重 —— pip 装包、venv 建环境、pip-tools 锁依赖、pipx 装全局工具、pyenv 管版本…… 每个工具各管一摊,配置文件散落一地
  • 依赖冲突让人崩溃 —— 项目 A 需要 numpy==1.24,项目 B 需要 numpy==2.0,来回切换虚拟环境手忙脚乱
  • 团队协作环境不一致 —— 你本地跑得好好的,同事拉代码就报错,requirements.txt 根本锁不住精确版本
  • Python 版本管理混乱 —— 系统自带 Python 3.8,项目需要 3.12,装了一堆版本却不知道怎么切换

这些问题不是你的错,而是 Python 生态的历史包袱。pip 诞生于 2008 年,用纯 Python 编写,虽然功能完善,但在速度统一性上已经跟不上时代了。

二、解决方案:uv 是什么?

uv 是由 Astral(Ruff 的开发团队)用 Rust 编写的新一代 Python 包和项目管理工具,于 2024 年开源。它的目标非常明确:

一个工具,替代 pip + venv + pip-tools + pipx + pyenv + virtualenv

核心优势:

特性 说明
极速 比 pip 快 10~100 倍(Rust 实现 + 全局缓存)
统一 包管理、环境管理、版本管理、工具管理一体化
兼容 提供 pip 兼容接口,迁移成本极低
智能 自动解析依赖、生成锁文件、管理虚拟环境
轻量 单一二进制文件,无需 Python 环境即可安装

三、安装 uv

macOS / Linux

1
2
3
4
5
6
7
8
9
# 推荐方式:官方安装脚本
curl -LsSf https://astral.sh/uv/install.sh | sh

# 或者用 wget
wget -qO- https://astral.sh/uv/install.sh | sh

# 也可以通过包管理器
brew install uv # Homebrew
sudo port install uv # MacPorts

Windows

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

# 或者用 WinGet / Scoop
winget install --id=astral-sh.uv -e
scoop install main/uv

其他方式

1
2
3
4
5
6
7
8
# 通过 pip(不推荐,因为 pip 本身就慢……但确实可以)
pip install uv

# 通过 pipx(推荐,隔离安装)
pipx install uv

# Docker
# 官方镜像:ghcr.io/astral-sh/uv

验证安装

1
2
uv --version
# uv 0.x.x (2026-xx-xx)

升级

1
2
3
4
5
# 独立安装器方式
uv self update

# pip 方式
pip install --upgrade uv

四、核心用法:uv vs pip 逐项对比

1. 创建虚拟环境

1
2
3
4
5
6
7
8
# pip 的方式(需要先建环境再激活)
python -m venv .venv
source .venv/bin/activate # Linux/Mac
.venv\Scripts\activate # Windows

# uv 的方式(一步到位,无需手动激活)
uv venv # 创建虚拟环境
uv sync # 自动创建并安装依赖

区别:uv 不需要手动激活虚拟环境,uv run 会自动使用项目环境。

2. 安装包

1
2
3
4
5
6
7
8
9
# pip
pip install requests
pip install "django>=4.0"
pip install -r requirements.txt

# uv(命令几乎一样,但快 10~100 倍)
uv pip install requests
uv pip install "django>=4.0"
uv pip install -r requirements.txt

区别:uv 提供了 uv pip 子命令来兼容 pip 的工作流,但更推荐使用项目级别的 uv add

3. 项目依赖管理

1
2
3
4
5
6
7
8
9
# pip:手动编辑 requirements.txt
echo "requests" >> requirements.txt
pip install -r requirements.txt

# uv:自动管理 pyproject.toml + uv.lock
uv init my-project # 初始化项目(生成 pyproject.toml)
uv add requests # 添加依赖(自动更新 pyproject.toml 和 uv.lock)
uv add pytest --dev # 添加开发依赖
uv add "django>=4.0" # 指定版本范围

区别:uv 自动维护 pyproject.toml(声明依赖)和 uv.lock(锁定精确版本),不再需要手写 requirements.txt

4. 同步环境

1
2
3
4
5
6
7
# pip:没有原生锁文件机制,依赖 requirements.txt
pip install -r requirements.txt

# uv:基于锁文件精确复现
uv sync # 完整同步(含开发依赖)
uv sync --no-dev # 仅生产依赖
uv sync --group test # 同步特定依赖组

区别uv.lock 锁定了所有依赖(包括子依赖)的精确版本,确保团队成员和 CI/CD 环境完全一致。

5. 运行代码

1
2
3
4
5
6
7
# pip:必须先激活虚拟环境
source .venv/bin/activate
python main.py

# uv:自动使用项目环境
uv run python main.py
uv run pytest # 直接运行测试

区别uv run 自动激活项目虚拟环境,无需手动 source/activate。

6. 全局工具安装

1
2
3
4
5
6
7
8
9
10
11
12
# pip:不推荐全局安装(会污染系统 Python)
pip install --user black

# pipx:需要额外安装
pipx install black

# uv:内置支持,每个工具独立隔离
uv tool install black
uv tool install ruff jupyter
uv tool list
uv tool upgrade black
uv tool uninstall jupyter

区别:uv 内置了 pipx 的功能,无需额外安装工具。

7. 临时运行工具(类似 npx)

1
2
3
4
5
6
7
# pip:没有对应功能,必须先安装再运行
pip install black && black .

# uv:uvx 一步到位,用完即弃
uvx black . # 格式化代码
uvx ruff check . # 代码检查
uvx "black==23.12.0" . # 指定版本运行

区别uvx 是 uv 的杀手级功能,自动创建临时环境、安装、运行、清理,全程无需手动干预。

8. Python 版本管理

1
2
3
4
5
6
7
8
9
# pip:不涉及,需要 pyenv 等额外工具
pyenv install 3.12
pyenv global 3.12

# uv:内置 Python 版本管理
uv python list # 查看可用版本
uv python install 3.10 3.11 3.12 # 安装多个版本
uv python pin 3.11 # 为项目指定版本
uv run --python 3.10 pytest # 用指定版本运行

区别:uv 内置了 pyenv 的功能,一个工具搞定版本管理。

9. 导出依赖

1
2
3
4
5
6
# pip:本身就是 requirements.txt 格式
pip freeze > requirements.txt

# uv:可导出多种格式
uv export --format requirements-txt > requirements.txt
uv export --format pyproject-toml

10. 缓存管理

1
2
3
4
5
6
7
# pip:缓存管理有限
pip cache dir
pip cache purge

# uv:全局缓存,跨项目共享
uv cache clean # 清理缓存
uv cache dir # 查看缓存位置

区别:uv 使用全局缓存,已下载的包在多个项目间共享,大幅减少重复下载。

五、命令速查表

场景 pip uv
安装包 pip install requests uv add requests
卸载包 pip uninstall requests uv remove requests
创建环境 python -m venv .venv uv venv
安装全部依赖 pip install -r requirements.txt uv sync
运行脚本 python main.py(需先激活) uv run python main.py
锁定依赖 pip freeze > requirements.txt uv lock(自动)
查看已安装 pip list uv pip list
查看依赖树 pipdeptree(需安装) uv tree
全局工具 pipx install black uv tool install black
临时运行 uvx black .
Python 版本管理 pyenv install 3.12 uv python install 3.12
构建发布 python -m build uv build
发布到 PyPI twine upload dist/* uv publish

六、从 pip 迁移到 uv

迁移非常简单,几乎零成本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 1. 安装 uv
curl -LsSf https://astral.sh/uv/install.sh | sh

# 2. 进入现有项目目录
cd your-project

# 3. 初始化 uv 项目
uv init

# 4. 从 requirements.txt 导入依赖
uv add -r requirements.txt

# 5. 完成!后续使用 uv 管理即可
uv sync
uv run python main.py

如果项目已经有 pyproject.toml(如 Poetry 项目),直接 uv sync 即可识别。

七、优缺点总结

优点

  1. 极速 —— Rust 编写,安装速度比 pip 快 10~100 倍,全局缓存避免重复下载
  2. 统一工具链 —— 一个工具替代 pip + venv + pip-tools + pipx + pyenv,减少工具碎片化
  3. 兼容性强 —— 提供 uv pip 兼容接口,支持 requirements.txt 导入,迁移成本极低
  4. 锁文件机制 —— uv.lock 确保依赖精确可复现,团队协作和 CI/CD 更可靠
  5. 内置 Python 版本管理 —— 不再需要 pyenv,一个工具管理所有 Python 版本
  6. uvx 临时运行 —— 类似 npx 的体验,用完即弃,不污染环境
  7. 现代化项目结构 —— 基于 pyproject.toml 标准,符合 Python 社区发展方向
  8. 活跃的社区 —— Astral 团队维护(Ruff 同团队),更新频繁,生态完善

缺点

  1. 相对年轻 —— 2024 年才发布,部分边缘场景可能存在兼容性问题
  2. 学习成本 —— 新增了大量命令和概念(lock 文件、依赖组、工具管理等),需要学习
  3. pip 生态依赖 —— 部分老旧教程和 CI/CD 模板仍以 pip 为标准,需要适配
  4. 企业环境适配 —— 某些严格限制网络或使用私有 PyPI 镜像的企业环境,可能需要额外配置
  5. 非 Python 标准库 —— pip 是 Python 官方打包工具,uv 是第三方工具,长期维护存在不确定性
  6. Windows 兼容性 —— 虽然支持 Windows,但部分功能在 Windows 上的体验可能不如 macOS/Linux

适用建议

场景 推荐
新项目 强烈推荐 uv
个人开发 推荐 uv
团队协作 推荐 uv(锁文件机制优势明显)
CI/CD 推荐 uv(速度快,环境一致性好)
老项目维护 可以逐步迁移,uv 兼容 pip
严格企业环境 评估后谨慎使用

八、总结

Python 生态的包管理工具经历了从 easy_installpipPoetry/Pipenv/PDMuv 的演进。每一次变革都在解决前一代工具的痛点。

uv 的出现,本质上是用 Rust 的性能优势 + 现代工具设计理念,对 Python 包管理进行了一次” 降维打击”。 它不是简单地在 pip 上打补丁,而是重新思考了”Python 开发者到底需要一个怎样的工具链” 这个问题。

如果你还在忍受 pip 的慢速和工具链的碎片化,现在就是尝试 uv 的最佳时机。安装只需一行命令,迁移几乎零成本,而获得的是 10~100 倍的速度提升和统一高效的工作流。

官方文档:https://docs.astral.sh/uv/
GitHub:https://github.com/astral-sh/uv