深入解析:uv:用 Rust 重写的极速 Python 包管理器
文章目录
uv 是由 Astral(Ruff 的作者)开发的统一型 Python 包与项目管理器。目标是用一个工具替代常见的多件套:
pip(安装)、
pip-tools(依赖锁定)、
virtualenv(虚拟环境)、
poetry(项目管理)、
pipx(工具安装)、
pyenv(Python 版本管理)、
twine(发布)。
为什么需要 uv
- 统一入口:包管理、依赖锁定、虚拟环境、工具安装、Python 版本管理与发布,一站式完成。
- 兼容现有习惯:提供与
pip兼容的子命令,迁移成本低。 - 适配个人与团队:本地开发、脚本化工具、CI/CD、团队一致性,都能覆盖。
核心优势
- 速度很快:Rust 实现 + 并行下载/安装 + 智能缓存。相较传统
pip场景普遍更快。 - 体验简单:一个工具覆盖多职责;
uv run自动使用项目虚拟环境,少切换、少心智负担。 - 空间高效:全局缓存与包去重,减少重复下载和磁盘占用。
- 可移植:
uv.lock提供跨平台一致的依赖锁定结果。 - 兼容生态:保留熟悉的
pip流程,同时提供更高层的项目与版本管理能力。
安装
# macOS / Linux(推荐)
curl -LsSf https://astral.sh/uv/install.sh | sh
# Homebrew(macOS)
brew install uv
快速上手
1) 项目管理(推荐默认用法)
# 创建项目骨架
uv init my-project
cd my-project
# 添加依赖(自动创建 .venv)
uv add requests
# 运行命令(无需手动激活虚拟环境)
uv run python main.py
# 锁定与同步依赖
uv lock
uv sync
项目结构(简化):
my-project/
├── pyproject.toml
├── uv.lock
├── README.md
└── src/
└── my_project/
└── __init__.py
2) 脚本内联依赖(小工具很方便)
echo 'print("hello uv")' > example.py
uv add --script example.py requests
uv run example.py
脚本会被写入最小依赖元数据,例如:
# /// script
# requires-python = ">=3.8"
# dependencies = ["requests"]
# ///
import requests
print("ok", bool(requests))
3) 工具安装与临时运行(替代 pipx)
# 临时执行(一次性)
uvx pycowsay 'hello'
# 全局安装工具
uv tool install ruff
ruff --version
4) Python 版本管理(替代 pyenv)
# 安装多个版本
uv python install 3.10 3.11
# 为当前项目创建指定版本的虚拟环境
uv venv --python 3.11
# 在目录内固定 Python 版本
uv python pin 3.11
5) 保留熟悉的 pip 流程(可选)
# 生成 requirements.txt(依赖锁定)
uv pip compile requirements.in --output-file requirements.txt
# 创建虚拟环境并同步依赖
uv venv
uv pip sync requirements.txt
适用场景
- 新项目:直接用 uv 起步,减少工具切换与配置复杂度。
- 追求速度的环境:本地开发/CI/CD 中的安装、同步、锁定更快。
- 多 Python 版本场景:一处管理、跨项目复用,避免额外装
pyenv。 - 脚本与命令行工具:脚本内联依赖和
uvx让一次性工具更轻量。 - 团队协作:用
uv.lock保证不同平台依赖一致,降低“在我机子上能跑”的问题。
与传统方式的简要对比
- 初始化:手动创建目录/venv →
uv init一步到位。 - 虚拟环境:手动激活/切换 →
uv run自动使用项目环境。 - 依赖锁定:
pip freeze/平台差异 →uv.lock跨平台一致。 - 工具运行:
pipx/临时安装 →uvx一次性运行或uv tool install全局安装。 - Python 版本:另装
pyenv→uv python原生管理。
提示:若仍偏好手动激活 venv,可使用:
uv venv .venv
source .venv/bin/activate
但更推荐在项目内直接:
uv run python main.py
注意:在我使用的过程发现,当先通过 uv init 初始化一个项目,并在这个项目中通过 uv run 运行任意一个脚本会生成 .venv,但是无法通过 source .venv/bin/activate 激活虚拟环境。如果想通过 source .venv/bin/activate 激活虚拟环境,只能使用第一种方法。
小结
如果你希望简化 Python 项目与环境管理、提升依赖安装速度,并减少在 pip/venv/pipx/pyenv/poetry 之间切换的成本,uv 是一个非常值得默认采用的选择。它兼顾了速度、兼容性与可移植性,适合个人开发者与团队协作环境。
参考文档:https://docs.astral.sh/uv/

浙公网安备 33010602011771号