商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > uv:新一代 Python 包管理器,快到离谱

uv:新一代 Python 包管理器,快到离谱

  发布于2026-05-26 阅读(0)

扫一扫,手机访问

uv:新一代 Python 包管理器,快到离谱

如果你还在忍受 pip 安装依赖时那漫长的等待,或者被 poetry、pyenv、venv 等一堆工具搞得晕头转向,那么今天要聊的这个新工具,可能会彻底改变你的 Python 开发体验。

uv:新一代 Python 包管理器,快到离谱

uv 是什么来头?

uv 出自 Astral 公司之手,一个用 Rust 语言重写的 Python 包管理器和项目管理工具。提起 Astral,你可能更熟悉他们另一个明星产品——Ruff,那个号称“快得离谱”的 Python Linter。没错,他们这次把“快”这个理念,带到了包管理领域。

一句话概括 uv 的野心:它试图成为 pip、venv、pyenv、pip-tools 和 poetry 的集合体,并且比它们都快得多。 这听起来有点夸张,但看完它的表现,你会发现这并非虚言。

到底有多快?

空谈无益,直接看对比。假设你需要安装一个包含 50 个包的 requirements.txt 文件:

# 传统 pip 方式
time pip install -r requirements.txt
# 耗时:约 15-30 秒

# 使用 uv
time uv pip install -r requirements.txt
# 耗时:约 0.5-2 秒

看到了吗?10 倍甚至 100 倍的速度差距。这不是实验室里的基准测试数字,而是你日常工作中能真切感受到的效率提升。

那么,它凭什么这么快?背后的技术支撑主要有几点:

  • Rust 语言实现:从底层就避开了 Python 解释器的开销,执行效率天然更高。
  • 全局缓存机制:同一个包,只要下载和解压过一次,就会存入全局缓存,后续安装直接从缓存读取,避免了重复的网络和磁盘 I/O。
  • 并行化操作:支持并行下载和安装包,充分利用多核 CPU。
  • 高效的依赖解析算法:依赖解析是包管理中最耗时的环节之一,uv 的算法在这方面做了深度优化。

安装 uv

上手 uv 非常简单,一行命令即可:

# macOS / Linux(推荐方式)
curl -LsSf  | sh

# Windows PowerShell
powershell -ExecutionPolicy ByPass -c "irm  | iex"

# 也可以用 pip 安装(但不推荐,毕竟 uv 的目标是替代 pip)
pip install uv

安装完成后,运行 uv --version 验证一下即可。

uv 的第一种用法:无缝替代 pip

这是最平滑的入门方式。你几乎不需要改变任何现有工作流,只是把命令前缀从 pip 换成 uv pip,速度就能获得飞跃。

# 创建虚拟环境(替代 python -m venv)
uv venv

# 激活虚拟环境(方式不变)
source .venv/bin/activate

# 安装包
uv pip install flask requests

# 指定版本范围
uv pip install "flask>=3.0.0"

# 从 requirements.txt 安装
uv pip install -r requirements.txt

# 导出依赖
uv pip freeze > requirements.txt

# 卸载包
uv pip uninstall flask

# 查看已安装包列表
uv pip list

命令逻辑完全一致,仅仅是前面多了个 uv,但带来的速度提升是实实在在的。仅凭这一点,就足以让日常开发体验焕然一新。

uv 的第二种用法:一体化项目管理

uv 的野心不止于替代 pip,它还想成为像 Poetry 或 PDM 那样的现代项目管理工具。

初始化项目

mkdir my-project && cd my-project
uv init

执行后,一个标准的项目结构就生成了:

my-project/
├── pyproject.toml    # 项目配置和依赖声明
├── README.md
├── hello.py
└── .python-version   # Python 版本锁定文件

管理依赖

# 添加依赖
uv add flask
uv add "requests>=2.31.0"
uv add pytest --dev    # 添加开发依赖

# 移除依赖
uv remove flask

# 同步环境(安装所有 pyproject.toml 中声明的依赖)
uv sync

每次执行 uv adduv removepyproject.tomluv.lock 文件都会自动更新,彻底告别手动维护 requirements.txt 的繁琐。

运行命令

# 在项目虚拟环境中运行脚本
uv run python app.py

# 运行项目模块
uv run python -m my_project

# 直接运行命令(uv 会确保环境就绪)
uv run flask run

uv run 是个非常聪明的设计。它会自动检查当前环境状态,如果发现依赖未安装或 lock 文件有变动,会先执行环境同步,再运行你的命令。从此,再也不会出现“哎呀,我忘了先 pip install”的尴尬情况。

锁定依赖

# 生成或更新 lock 文件
uv lock

# 仅升级某个特定包
uv lock --upgrade-package requests

生成的 uv.lock 文件会锁定所有直接和间接依赖的精确版本,确保团队成员之间、开发与生产环境之间的绝对一致性。这个思路和 Node.js 的 package-lock.json、Rust 的 Cargo.lock 如出一辙,是现代化依赖管理的标配。

uv 管理 Python 版本

除了包,uv 还能管理 Python 解释器本身,一定程度上可以替代 pyenv。

# 安装指定版本的 Python
uv python install 3.12
uv python install 3.11 3.10   # 一次安装多个版本

# 查看已安装的 Python 版本
uv python list

# 为当前项目固定 Python 版本
uv python pin 3.12

uv python pin 命令会在项目根目录创建一个 .python-version 文件。之后在此目录下执行任何 uv 命令,都会自动使用指定的 Python 版本,非常方便。

uv 的 tool 命令

这个功能相当实用,它允许你安装和管理那些作为命令行工具使用的 Python 包,类似于 pipx 的定位。

# 安装全局工具
uv tool install ruff
uv tool install black
uv tool install httpie

# 直接运行,无需永久安装(类似 Node.js 的 npx)
uvx ruff check .
uvx black --check .
uvx cowsay "hello"

这里的 uvxuv tool run 的简写。它的妙处在于,会在一个临时的、隔离的环境中运行指定工具,用完后环境自动清理,不会污染你的主环境。这对于那些偶尔才用一次的工具(比如用 uvx cookiecutter 生成项目模板)来说,简直是完美解决方案。

uv 的脚本支持

uv 还有一个非常酷的特性:支持在 Python 脚本文件内部直接声明依赖。

# /// script
# requires-python = ">=3.12"
# dependencies = [
#     "requests",
#     "rich",
# ]
# ///

import requests
from rich import print

response = requests.get("https://httpbin.org/json")
print(response.json())

运行这个脚本时,只需:

uv run my_script.py

uv 会自动创建一个临时虚拟环境,安装脚本头部声明的依赖,然后执行脚本。整个过程无需手动准备环境,也无需额外的 requirements.txt 文件。对于编写一次性脚本、分享可复现的代码片段来说,这个功能极大地提升了便利性。

从现有项目迁移到 uv

如果你手头有使用传统 requirements.txt 的老项目,迁移到 uv 的过程非常平滑。

# 1. 创建虚拟环境
uv venv

# 2. 安装现有依赖
uv pip install -r requirements.txt

# 3. (可选)迁移到 uv 的项目管理模式
uv init --bare
uv add flask requests pandas   # 添加你的核心依赖
uv sync

迁移到 pyproject.toml 管理后,理论上就可以告别 requirements.txt 了。当然,你也可以选择保留它,以便与尚未使用 uv 的同事协作。

uv 和 Conda 的关系

需要明确的是,uv 当前主要专注于纯 Python 包的管理。如果你的项目严重依赖 CUDA、特定的 C 库或系统级二进制文件(常见于深度学习、科学计算领域),那么 Conda 目前仍然是更合适的选择。

简单划分一下适用场景:

  • 纯 Python 开发:如 Web 后端、爬虫、自动化脚本等,uv 的能力完全覆盖且体验更优。
  • 数据科学/机器学习:涉及 CUDA、MKL、HDF5 等复杂非 Python 依赖时,Conda 的生态系统更具优势。

当然,以 uv 的发展势头,未来支持更复杂的依赖管理也并非不可能。

uv 的现状和未来

截至撰写本文时,uv 仍处于快速迭代期(版本号约为 0.7.x),但其稳定性和性能已经得到了广泛认可。不少知名公司,如 Vercel、Dagster 等,已开始在生产环境中使用它。

如果你还在使用 pip + venv + requirements.txt 的传统组合,强烈建议花点时间尝试一下 uv。迁移成本极低,但带来的效率提升和体验优化却是实实在在的。

面试题

1. uv 为什么比 pip 快这么多?

2. uv.lock 文件的作用是什么?为什么要提交到 Git?

3. uvx 命令和 uv tool install 有什么区别?分别适用什么场景?

4. uv 能完全替代 Conda 吗?为什么?


本文转载于:https://juejin.cn/post/7643043636965212169 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注