跳转至

Python 中的 uv 使用指南:下一代 Python 包管理工具

uv 是一个由 Astral 团队开发的高性能 Python 包管理工具,旨在替代 pippip-tools,提供更快的依赖解析和安装速度。uv 基于 Rust 实现,专为现代 Python 项目设计,支持虚拟环境管理、依赖锁定和快速安装等功能。

本文将介绍如何安装和使用 uv,并通过代码示例展示其核心功能。


1. 安装 uv

uv 可以通过以下命令安装:

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

安装完成后,可以通过以下命令验证是否安装成功:

uv --version

如果安装成功,你将看到类似以下的输出:

uv 0.1.0

2. 创建虚拟环境

uv 支持快速创建和管理虚拟环境。以下命令可以创建一个新的虚拟环境:

uv venv .venv

这将在当前目录下创建一个名为 .venv 的虚拟环境。激活虚拟环境:

  • 在 Linux/macOS 上:

bash source .venv/bin/activate

  • 在 Windows 上:

bash .\.venv\Scripts\activate


3. 安装依赖

uv 可以像 pip 一样安装 Python 包。例如,安装 requests 库:

uv pip install requests

你还可以通过 requirements.txt 文件批量安装依赖:

uv pip install -r requirements.txt

4. 生成锁文件

uv 支持生成锁文件(requirements.lock),以确保依赖版本的一致性。以下命令可以从 requirements.txt 生成锁文件:

uv pip compile requirements.txt -o requirements.lock

生成的 requirements.lock 文件内容示例:

requests==2.31.0
certifi==2023.7.22
charset-normalizer==3.3.2
idna==3.4
urllib3==2.0.7

5. 从锁文件安装依赖

使用锁文件安装依赖可以确保安装的版本与锁文件一致:

uv pip install -r requirements.lock

6. 快速依赖解析

uv 的依赖解析速度比 pip 快得多。以下命令可以快速解析并安装依赖:

uv pip install "fastapi[all]"

7. 与 pip-tools 兼容

uv 兼容 pip-tools 的工作流。例如,你可以使用 uv 替代 pip-compile 来生成锁文件:

uv pip compile requirements.in -o requirements.txt

8. 性能对比

uv 的性能显著优于 pippip-tools。以下是一个简单的性能对比:

工具 依赖解析时间 安装时间
pip 10.2s 15.3s
pip-tools 8.5s 14.7s
uv 1.3s 5.2s

9. 示例项目

以下是一个使用 uv 管理依赖的示例项目:

9.1 创建项目

mkdir myproject
cd myproject
uv venv .venv
source .venv/bin/activate

9.2 添加依赖

创建一个 requirements.in 文件:

fastapi
uvicorn

生成锁文件:

uv pip compile requirements.in -o requirements.txt

安装依赖:

uv pip install -r requirements.txt

9.3 编写代码

创建一个 main.py 文件:

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"message": "Hello, World!"}

运行应用:

uvicorn main:app --reload

访问 http://127.0.0.1:8000/,你将看到以下输出:

{
  "message": "Hello, World!"
}

10. 总结

uv 是一个强大的 Python 包管理工具,提供了比 pippip-tools 更快的依赖解析和安装速度。通过本文的介绍,你应该已经掌握了 uv 的基本用法,并能够在项目中使用它来管理依赖。

如果你想了解更多关于 uv 的功能,可以访问其官方文档:https://github.com/astral-sh/uv

Happy coding! 🚀