uv 实战指南:替代 pip/poetry 的下一代 Python 包管理器深度评测(2026)

📝 402 字 · ☕ 1 分钟阅读

前言:Python包管理的痛点

如果你写过 Python,你一定经历过这样的场景:pip install 了一个包,等了半天,然后看到一堆黄色警告。换个项目,又得重新装一遍。换台机器,同样的坑再踩一次。

我大概从2020年开始认真写 Python,那时候 pip + venv 是标配。后来试过 Poetry,觉得 pyproject.toml 比 requirements.txt 优雅不少。再到 Conda,确实解决了二进制依赖的问题,但安装慢得让人怀疑人生。

2024年底,我注意到 Rust 写的 Python 工具开始扎堆出现——ruff 替代 flake8/pylint,pyright 替代 mypy……然后 uv 出现了。

不是那种”又一个工具”的无感。是那种”卧槽”的感觉。

uv 是什么

uv 是 Astral 公司(对,就是写 ruff 那帮人)用 Rust 重写的 Python 包管理器。一句话说清楚:它就是 pip + virtualenv + poetry + pip-tools 的一个二进制文件,而且快得不讲道理

官方数据:安装依赖比 pip 快 10-100 倍。我用了一个月之后想说——这个数据没夸张。

安装 uv

安装方式简单到离谱:

# macOS / Linux
curl -LsSf https://astral.sh/uv/install.sh | sh

# 或者用 pip(自己引用自己,很帅)
pip install uv

# 验证
uv --version
# uv 0.6.3 (Homebrew 2026-07-05)

装完重启终端,uv 就在 PATH 里了。没有 Python 版本依赖,没有虚拟环境准备工作——因为它本身是 Rust 编译的静态二进制,什么都不需要。

核心功能实测

1. 替代 pip:快得离谱

我拿一个真实项目做测试:django + djangorestframework + celery + redis + psycopg2-binary + pandas + numpy + scikit-learn。总共约 40 个依赖。

pip 安装时间: 2分38秒(含依赖解析)

uv pip install 时间: 8.3秒

我第一次看到这个结果的时候以为是报错了。第二次又跑了一遍,8.1秒。

原理也不复杂:

  • Rust 写的 HTTP 客户端,并发下载比 Python 的 urllib 快太多
  • 全局缓存机制——同一个包版本只下载一次,跨项目共享
  • 不生成 setup.py 的 egg-info,省掉大量 IO

2. 替代 virtualenv:痒点全解决

用 uv 创建虚拟环境就一行:

# 创建虚拟环境
uv venv

# 激活(和原来一样)
source .venv/bin/activate

# 但更常用的是——不激活直接跑
uv run python script.py
uv run pytest tests/

我最喜欢的是 uv run。以前切换项目,要么 source 环境,要么忘了激活然后装错全局。uv 自动检测当前目录的 .venv,如果不存在就帮你创建。你只管跑命令,环境的事它管。

3. 替代 poetry:项目管理也包了

Poetry 用户会觉得很亲切:

# 初始化新项目
uv init my-project
cd my-project
# 自动生成 pyproject.toml

# 添加依赖
uv add flask
uv add --dev pytest pytest-cov

# 锁版本
uv lock
# 生成 uv.lock(类似 poetry.lock)

# 安装所有依赖(含 dev)
uv sync

对比 Poetry,uv 的优势很明显:

  • 依赖解析速度:Poetry 慢,uv 几乎是瞬间
  • 锁文件兼容:uv.lock 比 poetry.lock 更接近 pip 的标准
  • 零额外依赖:不需要 Python 3.10+ 的特定版本

4. 杀手锏:tool run 和全局工具管理

这个功能我每天都用:

# 临时跑一个工具,不需要全局安装
uv tool run black --check src/
uv tool run ruff check .

# 安装工具到隔离环境
uv tool install pre-commit
uv tool install mypy

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

uv tool run 相当于 npx 在 JavaScript 世界的功能——我不用装 ruff 到系统全局,也不用每个项目都装一遍。跑一次,下载一次,往后直接执行。工具链的依赖和项目依赖完全隔离,再也不用担心版本冲突。

企业级场景实测

CI/CD 中的 uv

我把一个 Dockerfile 从 pip 改成 uv 之后,构建时间直接砍半:

# 这是之前的 Dockerfile
FROM python:3.12-slim
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 构建时间:约 3分钟

# 改 uv 之后
FROM python:3.12-slim
COPY requirements.txt .
RUN pip install uv && \
    uv pip install --system --no-cache -r requirements.txt
# 构建时间:约 45秒

3 分钟 vs 45 秒,CI 账单直接下来了。如果你在 GitHub Actions 上跑,每个月省下的 Actions 分钟数相当可观。

Monorepo 中的依赖管理

uv 支持 workspace(工作区),让我可以一个仓库管理多个 Python 包:

# 顶层的 pyproject.toml
[tool.uv.workspace]
members = ["packages/*"]

# packages/api/pyproject.toml 和 packages/core/pyproject.toml 各自独立
# uv sync 会自动解析 workspace 内所有包之间的依赖关系

之前用 Poetry 做这个需要手动配置 path 依赖的路径别名。uv 开箱即用。

和竞品的对比

功能 uv pip Poetry Conda
安装速度 ⚡ 极快 🐢 慢 🐢 慢 🐢 极慢
依赖解析 ⚡ 毫秒级 — 无 🐢 秒级 🐢 秒级
二进制依赖 ✅ 部分 ✅ 部分 ✅ 部分 ✅ 全面
Python 版本管理 ✅ uv python install ✅ conda install
锁文件 ✅ uv.lock ✅ poetry.lock
Workspace ✅ 原生 ⚠️ 有限
安装体积 ~25MB 单文件 ~5MB ~30MB ~500MB+

遇到的坑和注意事项

用了一个月,踩了几个坑,记一下:

坑1:某些包的二进制版本不兼容

psycopg2 在 uv 下需要在 pyproject.toml 里指定 psycopg2-binary(带 -binary 后缀的那个),否则编译会报错。不是 uv 的问题,是所有基于 PEP 517 构建的工具都会遇到,但 Poetry 用户可能没注意到因为 Poetry 隐式处理了。

坑2:uv.lock 和 pip 的 requirements.txt 转换

团队成员如果还有人用 pip,需要 uv export --format requirements.txt > requirements.txt 导出兼容格式。不过说实话,既然上了 uv 就别回去了。

坑3:国内网络问题

uv 默认不从 pip 的镜像源配置里读取。需要手动指定:

export UV_INDEX=https://pypi.tuna.tsinghua.edu.cn/simple

# 或者在 pyproject.toml 中配置
[[tool.uv.sources]]
name = "pypi"
url = "https://pypi.tuna.tsinghua.edu.cn/simple"

如果没有配镜像,在 GitHub Actions 上的下载速度受限于 PyPI 官方 CDN,有时候反而比加了镜像的 pip 慢。这点需要注意。

总结

如果你现在问我,Python 项目用什么管理依赖,我的答案是:无脑上 uv

不是因为它最”新”,而是因为它实实在在地解决了痛点:

  • 安装速度起飞,CI 账单直降
  • 一个二进制搞定 pip + venv + poetry 的活
  • 工具链管理(uv tool run)真的是日常高频功能
  • Workspace 支持完美解决多包项目的依赖管理

目前 uv 还不支持 Conda 生态的二进制包分发(比如科学计算里那些 C++ 扩展),所以如果你的项目重度依赖 Conda 的预编译包,你可能需要多等一个版本。但对于绝大多数 Python web 开发、API 开发、数据处理项目来说——现在就是换的最好时机。

如果你还没用过,建议从一个小项目开始试。装完跑一次 uv pip install -r requirements.txt,感受一下什么叫”这才是 Python 该有的速度”。

常见问题(FAQ)

Q: uv 能完全替代 pip 吗?

对 99% 的日常场景来说,可以。唯一例外是某些 conda-only 的包(如 gdal、opencv 的特定版本)或需要预编译 wheel 的旧版 Linux 系统。

Q: 已有项目怎么迁移到 uv?

最简单的:在项目目录下跑 uv add $(cat requirements.txt),自动生成 pyproject.toml 和 uv.lock。如果已有 pyproject.toml,直接 uv sync 即可。

Q: uv 和 pipx 的关系是什么?

uv tool 就是 pipx 的替代品。你不需要再单独装 pipx,uv 内置了同样的”隔离安装工具”功能。用法也几乎一样。

Q: 在 CI/CD 中如何用 uv 配合 pip?

uv pip install 语法,它是 pip 兼容模式,可以用 pip 的参数和 requirements.txt。或者用 uv export 导出 requiremenets.txt 给传统流程用。

相关阅读

📤 分享这篇文章