uv:下一代 Python 包管理器

814 阅读9分钟

在 Python 开发的世界中,包管理工具是开发者日常工作中不可或缺的一部分。无论是构建 Web 应用、进行数据分析,还是开发大语言模型(LLM)相关项目,一个高效、可靠的包管理工具都能显著提升开发体验。然而,传统的工具如 pipvirtualenv 在面对复杂项目时,往往暴露出一些短板:安装速度慢、依赖解析效率低、虚拟环境管理繁琐,这些问题让开发者感到头疼。

什么是 uv

对于每一位 Python 开发者来说,日常工作都离不开 pip 和 venv。它们就像空气一样,我们依赖它,但有时也会因其缓慢的依赖解析和繁琐的环境管理而感到窒息。特别是对于大语言模型(LLM)和人工智能领域的开发者来说,项目依赖庞大而复杂,环境配置往往是“万里长征第一步”。但现在,这一切可能将迎来终局。

你是否听说过 Ruff?那个用 Rust 编写,比 Flake8、isort 快上百倍的 Python Linter。如今,它的创造者 Astral 公司,又为我们带来了另一个革命性工具——uv。

2024 年,一个由 Rust 语言驱动的新工具 uv 横空出世,迅速席卷 Python 社区。它不仅将依赖安装速度提升到令人惊叹的秒级,还整合了虚拟环境管理、项目构建、脚本运行和 Python 版本管理等功能,成为 Python 开发者的高效助手。uv 的跨平台支持和极致性能使其成为开发大语言模型、机器学习项目或企业级应用的理想选择。

image.png

uv 的核心优势

  1. 闪电般的速度
    uv 的依赖解析和安装速度比 pip 快 10-100 倍。对于需要安装大型库(如 torchtransformerstensorflow)的大语言模型开发者来说,这一优势尤为显著。例如,安装 transformers 可能从几分钟缩短到几秒钟。

  2. 高效的存储管理
    uv 使用全局缓存机制,避免重复下载相同的依赖包,有效节省磁盘空间。这对于需要频繁切换项目的开发者来说尤为实用。

  3. 跨平台兼容性
    uv 在 Linux、Windows 和 macOS 上表现一致,无论您使用什么操作系统,都能享受相同的流畅体验。

  4. 一站式功能
    uv 集成了包管理、虚拟环境创建、Python 版本管理、项目初始化和脚本运行等功能,无需安装多个工具即可完成所有操作。

  5. 现代化特性
    支持内联依赖管理(PEP 723)、Git 依赖、URL 依赖以及按日期锁定依赖,这些特性让 uv 在复杂项目中游刃有余。

image.png

对于大语言模型开发者来说,uv 的高效性和环境可重现性尤为重要。它能确保模型训练环境的快速搭建和一致性,避免因依赖版本问题导致的实验失败或结果不可复现。

uv 的安装与基本使用

安装 uv

安装 uv 非常简单,以下是针对不同操作系统的命令:

  • macOS 和 Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
  • Windows(使用 PowerShell)
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"

安装完成后,检查版本以确认安装成功:

uv --version

如果显示类似 uv 0.x.x 的版本号,说明 uv 已就绪。

创建和管理虚拟环境

uv 将虚拟环境管理简化到了极致。创建一个虚拟环境只需:

uv venv

这会在当前目录下生成一个 .venv 文件夹。激活虚拟环境的方式根据操作系统不同而异:

  • macOS/Linux
source .venv/bin/activate
  • Windows
.venv\Scripts\activate

相比 virtualenv,uv 创建虚拟环境的速度更快,且能自动检测和使用指定版本的 Python,确保项目环境的一致性。

安装依赖

uv 支持多种安装方式,以下是常见场景的示例:

  • 安装单个包
uv pip install flask
  • 从 requirements.txt 安装
uv pip install -r requirements.txt
  • 安装可编辑模式(用于本地开发)
uv pip install -e .

以安装 transformers 为例,使用 pip 可能需要 2-3 分钟,而 uv 通常只需 5-10 秒。这种速度差异在大规模项目中尤为明显。

项目管理实战

让我们通过一个完整的 Flask 项目,展示 uv 的项目管理能力。

初始化项目

使用以下命令初始化一个 Flask 项目:

uv init my-flask-app
cd my-flask-app

这会生成以下文件结构:

my-flask-app/
├── pyproject.toml  # 项目配置文件
├── app.py          # 主应用文件
└── README.md       # 项目说明

pyproject.toml 是项目的核心配置文件,uv 会自动管理其中的依赖和元数据。

添加依赖

添加 Flask 依赖:

uv add flask

uv 会更新 pyproject.toml 文件并在虚拟环境中安装 Flask。更新后的 pyproject.toml 可能如下:

[project]
name = "my-flask-app"
version = "0.1.0"
dependencies = [
    "flask>=2.3.2",
]

编写 Flask 应用

编辑 app.py,添加一个简单的 Web 服务:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return "欢迎体验 uv,Python 开发新利器!"

@app.route('/about')
def about():
    return "这是一个使用 uv 管理的 Flask 项目示例。"

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=5000)

运行项目

使用 uv run 运行应用:

uv run app.py

uv 会自动激活虚拟环境并启动 Flask 服务。打开浏览器,访问 http://127.0.0.1:5000/http://127.0.0.1:5000/about,即可看到页面内容。整个过程无需手动管理环境,极大简化了开发流程。

Python 版本管理

uv 内置了对 Python 版本的管理功能,无需额外安装 pyenv 或其他工具。

安装特定 Python 版本

安装 Python 3.12:

uv python install 3.12

uv 会自动下载并安装指定版本的 Python,并将其添加到全局可用版本列表中。

指定项目使用的 Python 版本

为项目固定 Python 3.12:

uv python pin 3.12

这会在项目目录下生成 .python-version 文件,内容为:

3.12

此后,uv 在该项目中会始终使用 Python 3.12,确保团队协作时版本一致。

查看可用版本

列出所有已安装的 Python 版本:

uv python list

这对于管理多个项目或调试版本相关问题非常有用。

脚本与依赖管理

uv 的高级功能使其在数据科学和大语言模型开发中尤为出色。以下是几个实用特性的详细介绍。

内联依赖管理(PEP 723)

uv 支持在脚本中直接声明依赖(PEP 723),无需额外的配置文件。这对于快速实验或分享脚本尤为方便。

创建一个脚本 analyze.py

# /// script
# dependencies = ["pandas==1.5.3", "seaborn==0.12.2"]
# ///

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# 生成示例数据
df = pd.DataFrame({
    "x": [1, 2, 3, 4, 5],
    "y": [2.1, 4.5, 6.8, 8.2, 10.0]
})

# 绘制散点图
sns.scatterplot(data=df, x="x", y="y")
plt.title("使用 uv 运行的简单数据可视化")
plt.show()

运行脚本:

uv run analyze.py

uv 会自动安装 pandasseaborn,并运行脚本生成散点图。这种自包含的方式非常适合数据科学家或模型开发者分享代码。

按日期锁定依赖

uv 支持按日期锁定依赖版本,确保环境可重现。例如,想使用 2024 年 12 月 31 日之前的依赖版本:

创建一个脚本 reproducible.py

# /// script
# dependencies = ["pandas"]
# [tool.uv]
# exclude-newer = "2024-12-31T00:00:00Z"
# ///

import pandas as pd
print(f"当前 pandas 版本: {pd.__version__}")

运行:

uv run reproducible.py

uv 将安装 2024 年 12 月 31 日之前最新的 pandas 版本。这种功能在大语言模型复现历史实验时非常有用。

锁定脚本依赖

为脚本生成锁定文件,确保依赖版本完全一致:

uv lock --script analyze.py

这会生成 analyze.py.lock 文件,记录精确的依赖版本。分发脚本时,只需附带锁定文件即可保证环境一致。

uv 与 PyCharm 集成

对于使用 PyCharm 的开发者,uv 可以无缝集成,提升开发效率。

配置 uv 环境

  1. 打开 PyCharm,进入 File > Settings > Project > Python Interpreter
  2. 点击“添加解释器”,选择“uv”作为虚拟环境工具。
  3. 指定 Python 版本(如 3.12),PyCharm 会调用 uv 创建虚拟环境。
  4. 在“Terminal”中,运行 uv pip install flask 添加依赖,PyCharm 会自动识别。

管理依赖

在 PyCharm 的“Python Packages”面板中搜索并安装包(如 flask),uv 会同步更新 pyproject.toml 和虚拟环境。

image.png

运行与调试

在 PyCharm 中直接点击“Run”按钮,uv 会自动激活虚拟环境并运行 app.py,支持断点调试和实时日志查看。

大语言模型开发环境搭建示例

假设我们要搭建一个基于 transformers 的大语言模型开发环境,以下是完整步骤:

  1. 初始化项目
uv init llm-project
cd llm-project
  1. 添加依赖
uv add transformers torch numpy
  1. 编写测试脚本 test_model.py
# /// script
# dependencies = ["transformers", "torch", "numpy"]
# ///

import torch
from transformers import BertTokenizer, BertModel

tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
model = BertModel.from_pretrained("bert-base-uncased")

text = "使用 uv 加速大语言模型开发"
inputs = tokenizer(text, return_tensors="pt")
outputs = model(**inputs)

print(outputs.last_hidden_state.shape)
  1. 运行脚本
uv run test_model.py

uv 会快速安装依赖并运行脚本,输出张量形状(如 [1, 8, 768])。整个环境搭建过程不到 10 秒,相比传统工具节省了大量时间。

uv 的局限性

尽管 uv 功能强大,但作为新兴工具,它也有一些需要注意的地方:

  1. 与 pip 的兼容性
    uv 支持大部分 pip 功能,但某些高级选项(如自定义索引源的复杂配置)尚未完全实现。未来版本可能会逐步完善。

  2. 平台特定性
    uv 生成的锁定文件与平台绑定,跨平台移植时可能需要重新生成依赖。建议在目标平台上运行 uv lock

  3. 学习曲线
    对于习惯 pippoetry 的用户,uv 的命令和 workflow 可能需要短暂适应,但其直观设计让上手过程并不复杂。

结语

对于 Python 开发者,尤其是从事大语言模型、数据科学或 Web 开发的朋友们,uv 是一个不可错过的工具。它不仅大幅提升了依赖管理和环境配置的效率,还通过内联依赖、按日期锁定和锁定文件等功能,确保了项目的高可重现性和团队协作的顺畅性。

现在就试试 uv 吧!用以下命令开启高效开发之旅:

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