深入解析: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 版本:另装 pyenvuv 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/

posted @ 2025-09-19 18:31  wzzkaifa  阅读(60)  评论(0)    收藏  举报