惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Vulnerabilities – Threatpost
月光博客
月光博客
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
美团技术团队
Last Week in AI
Last Week in AI
Jina AI
Jina AI
P
Privacy International News Feed
有赞技术团队
有赞技术团队
WordPress大学
WordPress大学
宝玉的分享
宝玉的分享
T
Tenable Blog
阮一峰的网络日志
阮一峰的网络日志
P
Proofpoint News Feed
T
Tailwind CSS Blog
Apple Machine Learning Research
Apple Machine Learning Research
P
Privacy & Cybersecurity Law Blog
人人都是产品经理
人人都是产品经理
S
Schneier on Security
Google DeepMind News
Google DeepMind News
爱范儿
爱范儿
C
Cisco Blogs
K
Kaspersky official blog
C
Cybersecurity and Infrastructure Security Agency CISA
Hugging Face - Blog
Hugging Face - Blog
博客园_首页
O
OpenAI News
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
IT之家
IT之家
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
酷 壳 – CoolShell
酷 壳 – CoolShell
T
Tor Project blog
博客园 - 【当耐特】
腾讯CDC
V
V2EX
A
Arctic Wolf
Webroot Blog
Webroot Blog
S
Securelist
小众软件
小众软件
大猫的无限游戏
大猫的无限游戏
D
Darknet – Hacking Tools, Hacker News & Cyber Security
博客园 - 三生石上(FineUI控件)
The GitHub Blog
The GitHub Blog
量子位
J
Java Code Geeks
博客园 - 叶小钗
S
SegmentFault 最新的问题
Project Zero
Project Zero
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Scott Helme
Scott Helme
Cyberwarzone
Cyberwarzone

又见苍岚

COLMAP PatchMatch Stereo 算法详解 事件驱动的状态机框架:从理论到工程实践 Git 在国内网络环境下无法 Push 的排查与修复 —— 配置 Clash 代理 分段五次多项式插值原理详解 路径插值方法深度对比研究 Claude Code 使用指南 OpenClaw 记忆管理与技能创建指南 CBS(Conflict-Based Search)算法详解 A* 算法及其变种详解 OpenClaw 配置多 Agents Windows Powershell 无法加载文件,因为在此系统上禁止运行脚本问题的解决方案 MaxClaw 安装流程 大模型 AI 名词介绍 AList 网盘聚合工具简介 Protobuf 简介与测试 Claude Code 简介以及 GLM 4.7 模型接入 Github 歌词下载工具 163MusicLyrics Python __getattr__ 懒加载 Python TypedDict 机器人仿真平台 Gazebo 安装记录 机器人仿真平台 Gazebo 简介 多机器人路径规划问题(Multi-Agent Path Finding, MAPF)简介 Python exifread 读取修改过的 jpeg 信息错误问题修复 3D 坐标系变换的理解 3D 旋转矩阵基本概念 MongoDB Compass 介绍 Flutter 开发指南 Snipaste 安装下载与黑屏问题解决方案 全局路径规划算法记录 2025 Python 版本性能测试 Flutter Hello World Flutter 安装环境配置 Ubuntu VMware 硬盘扩容后 SMBus Host controller not enabled 报错问题解决 Python NetworkX 教程 Docker GPU 报错 - Failed to initialize NVML Unknown Error 解决方案 Python matplotlib 图表绘制 cuda-toolkit 安装替代 Cuda 与 Cudnn Jinja2 Python 利用 docxtpl 和 Jinja2 生成基于模板的 Word 文档 Docker 实现 CPU 核心隔离 LoFTR 基于 Transformer 的特征提取匹配算法 OmniGlue 特征匹配 SuperGlue 使用图神经网络学习特征匹配 Ubuntu 下将 xlsx 文件按照 sheet 转换为 图片 Python 使用 SQLAlchemy Python FastAPI 教程 openwrt 软路由配置安装 Nav2 地图文件(PGM/YAML)规范标准 3D OBJ 模型转换为 glb 瓦片格式 Python 源码 Redis 数据库介绍 Ubuntu 22.04 内核自动升级导致 MongoDB 7.0.12 错误记录 ubuntu 20.04 安装 ROS Noetic ubuntu 18.04 安装 ROS Melodic VMware Workstation Pro 个人免费版下载、安装、使用指南 Hybrid A-star 路径规划 Reeds-Shepp 曲线 Dubins 曲线 Linux kvm 虚拟机网络不通的问题解决方法 Ubuntu 自动内存清理 BiliBili 缓存视频转 mp4 Python 求解线性规划 3D Gaussian Splatting 官方源码实践记录 ImageMagick 教程 Ubuntu 22.04 安装 Colmap 对数几率 odds Ubuntu nmcli 网络管理工具使用指南 SuperPoint 自监督深度学习特征点提取 SyncTV Music Tag Web 在线音乐信息整理工具 ncm 格式转 mp3 MusicBrainz 音乐元数据百科数据库 Ubuntu 网络流量监控工具 私人云音乐平台 Navidrome 入门 手眼标定 四元数(Quaternions) OHTTPS 实现免费自动 https 证书申请、更新、部署 ubuntu 22.04 安装 CloudCompare 单机 KVM 虚拟机冷迁移 Ubuntu 22.04 使用 mdadm 实现软 raid 小鱼 一键安装 ROS-humble Fluid -46- 基于 Simpletex API 构建公式识别页面 公式识别 API 简介 -- Simpletex 使用 Python web 部署库 waitress 3D Gaussian Splatting for Real-Time Radiance Field Rendering Ubuntu Swap 简介与空间扩展 Ubuntu 24.04 安装 forticlient Clash Verge 使用 MongoDB 7.0.17 集群 Docker 构建源码 Error code - 2013. Lost connection to MySQL server during query 问题解决 Python 日志记录库 loguru 使用指北 Python 实现 Web 日志查看服务 MySQL LOAD DATA LOCAL INFILE 极速数据加载 Image size exceeds limit of 89478485 pixels 解决方案 Docker 使用 NVIDIA GPU 驱动错误解决 阿里云 docker 镜像仓库 Ubuntu中没有wired connected的解决方案 MinIO 简介 subconverter 代理订阅格式转换 修复 node –openssl-legacy-provider is not allowed in NODE_OPTIONS 错误 Ubuntu 使用 Clash For Linux 客户端
Python 环境管理工具 uv
Yiwei Zhang · 2025-10-31 · via 又见苍岚

uv 是由 Astral 公司开发的一款 Rust 编写的 Python 包管理器和环境管理器,它的主要目标是提供比现有工具快 10-100 倍的性能,同时保持简单直观的用户体验。本文介绍相关内容。

简介

UV 是一个由 Astral 公司用 Rust 开发的高性能 Python 包管理工具,旨在提供比传统 pip 更快的包安装和依赖管理体验。

An extremely fast Python package and project manager, written in Rust.

Python 生态系统中的包管理一直是开发者关注的焦点。从最初的 pip 到后来的 Poetry、PDM 等工具,每一次演进都试图解决前代工具的痛点。而今天我们要介绍的 UV,作为由 Ruff 团队(Astral)开发的下一代 Python 包管理工具,正以其惊人的速度和创新的设计理念,重新定义 Python 包管理的标准。

什么是UV?

UV 是一个极速的 Python 包管理器和解析器,由 Rust 编写,专注于提供卓越的性能和用户体验。其名称 “UV” 源自 “μv”(微伏),暗示着其轻量级和高效的特性。作为 pip 的直接替代品,UV 提供了兼容的命令行接口,同时在速度上实现了数量级的提升。

UV的核心优势

与传统的 Python 包管理工具相比,UV 具有以下显著优势:

  • 🚀 一体化工具:一个工具替代 pip、pip-tools、pipx、poetry、pyenv、twine、virtualenv 等多种工具
  • ⚡️ 极致速度:比 pip 快 10-100 倍
  • 🗂️ 全面项目管理:提供通用锁文件的综合项目管理功能
  • ❇️ 脚本运行:支持带有内联依赖元数据的脚本运行
  • 🐍 Python版本管理:安装和管理不同的 Python 版本
  • 🛠️ 工具安装:运行和安装以 Python 包形式发布的工具
  • 🔩 兼容pip接口:提供熟悉的命令行界面,同时大幅提升性能
  • 🏢 工作区支持:支持 Cargo 风格的工作区,适用于大规模项目
  • 💾 高效磁盘空间利用:通过全局缓存实现依赖去重
  • ⏬ 简易安装:无需 Rust 或 Python 环境,可通过 curl 或 pip 直接安装
  • 🖥️ 多平台支持:支持 macOS、Linux 和 Windows 系统

随着Python项目规模和复杂度的增长,传统工具在性能和用户体验方面的局限性日益凸显。UV 的出现,为开发者提供了一个更快、更可靠的选择,特别适合大型项目和CI/CD环境中的应用。

UV和其他工具对比

在Python生态系统中,包管理和环境管理工具众多,主要包括pip+virtualenv、Poetry、Conda等。在决定是否采用UV之前,了解它与现有工具的区别和优势非常重要。

UV vs. pip+virtualenv

pip和virtualenv是Python包管理和虚拟环境创建的传统工具组合。UV相比它们具有以下优势:

  • 速度:UV的Rust实现使其比pip快10-100倍,特别是在大型项目中
  • 集成环境管理:UV将包管理和环境管理集成在一个工具中,简化了工作流程
  • 内存使用:UV在包安装和依赖解析过程中使用的内存显著减少
  • 错误处理:UV提供更清晰的错误信息和更好的依赖冲突解决方案
  • 可复现性:UV的锁文件方法确保了跨系统环境的一致性,这是基本requirements.txt文件无法保证的
UV vs. Conda

Conda是一个完整的包管理解决方案,特别适合科学计算环境。UV与Conda相比:

  • 速度:UV的包安装和依赖解析速度远快于Conda的有时缓慢的性能
  • 资源占用:UV具有更小的资源占用,意味着更少的内存使用和更快的启动时间
  • 集成性:UV与现有Python打包标准和工具无缝集成,更容易与更广泛的Python生态系统协作
  • 非Python包:Conda可以管理非Python包和系统级依赖,而UV专注于Python包
UV vs. Poetry

Poetry是另一个现代Python项目管理工具,与UV有许多相似之处:

  • 依赖管理:两者都有效处理包依赖和虚拟环境
  • 项目结构:两者都提供初始化和构建Python项目的工具
  • 锁文件:两者都生成锁文件以确保环境可复现

然而,UV的Rust实现使其在速度和资源使用方面具有显著优势。此外,UV与现有Python包管理工具的兼容性意味着它可以与其他工具(如pip)一起工作,提供了Poetry更固执己见的方法有时缺乏的灵活性。

功能对比表

功能特性 UV pip+virtualenv Conda Poetry
实现语言 Rust Python Python Python
速度 比pip快10-100倍 基准线 慢于pip 快于pip
内存使用 非常高效 较高 中等
环境管理 内置 需要单独工具 内置 内置
依赖解析 快速、现代解析器 基础 全面 现代解析器
非Python包支持
锁文件 否(基本requirements.txt)
项目结构化
包发布 是(需要twine)
兼容性 与现有pip生态系统兼容 标准Python工具 自有生态系统 更固执己见的方法
错误处理 清晰的错误信息 基本 良好 良好
资源占用 最小 中等 中等
科学计算焦点
跨平台一致性 有限 优秀 良好

总的来说,UV结合了现有工具的最佳特性,同时通过其Rust实现提供了显著的性能优势。对于寻求更快、更可靠的Python包管理解决方案的开发者来说,UV是一个极具吸引力的选择,特别是对于大型项目或CI/CD环境。

UV的安装与常用命令

安装UV

UV的安装非常简单,支持多种操作系统和安装方式。以下是几种常见的安装方法:

使用官方安装脚本(推荐)
1
2
# On macOS and Linux.
curl -LsSf https://astral.sh/uv/install.sh | sh
1
2
# On Windows.
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
1
2
# With pip.
pip install uv
1
2
# Or pipx.
pipx install uv

如果使用单独的安装器, uv 可以更新自己:

1
2
3
4
5
6
uv self update

-->
> uv self update
info: Checking for updates...
success: You're on the latest version of uv (v0.9.6)

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

1
uv --version

安装正确会得到版本号:

1
uv 0.9.6

管理 Python 版本

uv 可以轻松管理多个 Python 版本,无需额外安装 pyenv 等工具。

查看可用的 Python 版本:

1
uv python list

输出结果类似如下:

如果已经安装会显示路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
uv python list

cpython-3.15.0a2-linux-x86_64-gnu <download available>
cpython-3.15.0a2+freethreaded-linux-x86_64-gnu <download available>
cpython-3.14.2-linux-x86_64-gnu <download available>
cpython-3.14.2+freethreaded-linux-x86_64-gnu /home/vvd/.local/bin/python3.14t -> /home/vvd/.local/share/uv/python/cpython-3.14.2+freethreaded-linux-x86_64-gnu/bin/python3.14t
cpython-3.14.2+freethreaded-linux-x86_64-gnu /home/vvd/.local/share/uv/python/cpython-3.14.2+freethreaded-linux-x86_64-gnu/bin/python3.14t
cpython-3.13.11-linux-x86_64-gnu <download available>
cpython-3.13.11+freethreaded-linux-x86_64-gnu <download available>
cpython-3.12.12-linux-x86_64-gnu <download available>
cpython-3.11.14-linux-x86_64-gnu <download available>
cpython-3.11.7-linux-x86_64-gnu /home/vvd/anaconda3/bin/python3.11
cpython-3.11.7-linux-x86_64-gnu /home/vvd/anaconda3/bin/python3 -> python3.11
cpython-3.11.7-linux-x86_64-gnu /home/vvd/anaconda3/bin/python -> python3.11
cpython-3.10.19-linux-x86_64-gnu <download available>
cpython-3.10.12-linux-x86_64-gnu /usr/bin/python3.10
cpython-3.10.12-linux-x86_64-gnu /usr/bin/python3 -> python3.10
cpython-3.9.25-linux-x86_64-gnu <download available>
cpython-3.8.20-linux-x86_64-gnu <download available>
pypy-3.11.13-linux-x86_64-gnu <download available>
pypy-3.10.16-linux-x86_64-gnu <download available>
pypy-3.9.19-linux-x86_64-gnu <download available>
pypy-3.8.16-linux-x86_64-gnu <download available>
graalpy-3.12.0-linux-x86_64-gnu <download available>
graalpy-3.11.0-linux-x86_64-gnu <download available>
graalpy-3.10.0-linux-x86_64-gnu <download available>
graalpy-3.8.5-linux-x86_64-gnu <download available>

安装特定版本的 Python:

1
2
3
4
5
6
7
8
9
10
11
12
# 安装最新的 Python 3.12
uv python install 3.12

# 安装特定版本
uv python install 3.11.6
uv python install cpython-3.14.2+freethreaded-linux-x86_64-gnu

# 安装 PyPy 版本
uv python install pypy3.10

# 卸载 python 版本
uv python uninstall cpython-3.14.2+freethreaded-linux-x86_64-gnu

创建和管理项目

UV提供了一套完整的命令用于创建和管理Python项目:

创建新项目

1
2
3
4
5
6
# 创建一个新的Python项目目录
uv init example
# 运行正确会显示:Initialized project `example` at `/路径/example`

# 可以指定 python 版本
uv init --python 3.14.2 my-project

有三个默认文件:README.mdmain.pypyproject.toml

查看目录内容:

1
2
3
4
5
6
7
8
9
cd example
tree -a -L 1
.
├── .git
├── .gitignore
├── .python-version
├── README.md
├── main.py
└── pyproject.toml

介绍uv工具主要使用的两个文件:

  • pyproject.toml:定义项目的主要依赖,包括项目名称、版本、描述、支持的 Python 版本等信息
  • uv.lock:记录项目的所有依赖,包括依赖的依赖,且跨平台,确保在不同环境下安装的一致性。这个文件由 uv 自动管理,不要手动编辑.

通过init创建项目之后,uv工具贴心地帮助我们生成了一些默认文件。

其中 hello.py 只是一段演示用的代码,

随后我们可以根据实际的项目需要删除这个代码文件,换成自己的实际代码。

1
2
3
4
5
6
$  cat .\hello.py
def main():
print("Hello from myproject!")

if __name__ == "__main__":
main()

pyproject.toml中是一些项目信息:

1
2
3
4
5
6
7
8
$  cat .\pyproject.toml
[project]
name = "myproject"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.12"
dependencies = []

注意uv init 创建项目之后,会自动将项目使用Git来管理。

创建项目之后,我们进入项目根文件夹的第一件事就是同步项目依赖。

1
2
3
4
5
$  uv sync
Using CPython 3.12.4 interpreter at: D:\miniconda3\envs\databook\python.exe
Creating virtual environment at: .venv
Resolved 1 package in 15ms
Audited in 0.05ms

同步之后,会自动查找或下载合适的 Python 版本,创建并设置项目的虚拟环境,构建完整的依赖列表并写入uv.lock 文件,最后将依赖同步到虚拟环境中。

uv sync同步之后,就可以运行项目的代码了。

添加国内源

在 pyproject.toml 文件中添加这样的字段,可以修改默认国内源:

1
2
3
[[tool.uv.index]]
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
default = true

也可以用这个命令修改:

1
uv add --default-index https://pypi.tuna.tsinghua.edu.cn/simple pydantic

除此之外,可以配置环境变量修改国内源:

1
UV_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple

注意:环境变量的设置会覆盖 pyproject.toml 中的配置

运行项目

使用uv管理项目, 我们就使用uv的命令来运行代码,不要像以前那样使用python xxx.py来运行。

main.py 文件包含一个简单的“Hello world”程序。尝试一下

1
uv run main.py

查看 Python 版本

1
uv run python --version

初始化一个新的虚拟环境:

1
2
3
4
5
6
7
8
9
10
11
# 创建虚拟环境,不加环境路径的话默认是保存在当前的.venv目录下
uv venv

# 指定环境保存目录
uv venv /path/to/venv

# 指定Python版本,注意需要对应版本的Python已经安装
uv venv -p 3.12

# --python 同 -p
uv venv --python 3.12

注意:uv工具不会自动下载Python包,因此如果设置-p时指定系统不存在的Python版本,则会报下面的错:

1
2
$ uv venv -p 3.13
No Python 3.13 In `PATH`. Is Python 3.13 installed?

启用环境的命令同Python的标准库venv:

1
2
3
4
5
# Unix
source venv/bin/activate

# Windows
venv\Scripts\activate

依赖管理命令

UV 提供了一系列强大的依赖管理命令,以下是最常用的几个:

添加依赖

使用 uv add 命令可以向项目添加依赖。该命令会自动更新 pyproject.toml 文件、锁文件和项目环境:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 添加单个包
uv add requests

# 指定版本约束
uv add 'requests==2.31.0'

# 添加 Git 依赖
uv add git+https://github.com/psf/requests

# 从 requirements.txt 文件添加所有依赖
uv add -r requirements.txt -c constraints.txt

# 升级包
uv add --upgrade vvdutils

删除依赖

使用 uv remove 命令可以删除项目依赖:

1
2
# 删除包
uv remove requests
升级依赖

使用 uv lock 命令配合 --upgrade-package 参数可以升级指定包:

1
2
# 升级特定包
uv lock --upgrade-package requests

该命令会尝试将指定包更新到最新的兼容版本,同时保持锁文件中其他依赖不变。

同步项目环境

使用 uv sync 命令可以确保项目环境与锁文件保持同步:

1
2
# 同步项目环境
uv sync
运行项目命令

uv run 命令可以在项目环境中运行脚本或命令。在每次运行前,UV 会验证锁文件是否与 pyproject.toml 同步,并确保环境与锁文件一致:

1
2
# 运行 Python 脚本
uv run main.py
构建项目分发包

uv build 命令可用于构建项目的源码分发包和二进制分发包(wheel):

1
2
3
4
5
6
7
8
# 构建项目
uv build

# 查看构建结果
ls dist/
# 输出示例:
# Successfully built dist/example-0.1.0.tar.gz
# Successfully built dist/example-0.1.0-py3-none-any.whl

这些命令提供了一个完整的项目依赖管理工作流程,从添加依赖、删除依赖、升级依赖到运行项目和构建分发包。UV 的这些命令设计直观且高效,大大简化了 Python 项目的依赖管理。

Python 包管理

当需要安装\管理系统环境的 python 包时, uv 提供了类似 pip 的接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 从 pypi上安装包,默认安装最新版本
uv pip install flask

# 从镜像网站上拉取安装包
uv pip install flask -i https://pypi.tuna.tsinghua.edu.cn/simple

# 更新包版本
uv pip install -U flask

# 安装特定版本的包:
uv pip install -U flask==3.0.0

# 从当前目录安装
uv pip install .

# 从当前目录安装,并且支持editable实时更新代码模式
uv pip install -e .

# 查看当前包列表
uv pip list

# 卸载包
uv pip uninstall flask

uv add VS uv pip install

uv pip installuv add 有重要区别,主要体现在使用场景和工作方式上:

uv pip install uv add
用途 直接安装包到当前环境, 不记录依赖 为项目添加依赖
工作方式 类似于传统的 pip install 不会自动更新 pyproject.tomlrequirements.txt 安装包到当前环境, 自动更新 pyproject.toml 中的依赖列表
适用场景 临时安装工具包\ 全局环境安装\ 测试某个包 项目开发\ 管理项目依赖

对比:

1
2
3
4
5
6
7
# 使用 uv add(推荐用于项目)
uv add pandas
# 这会安装 pandas 并更新 pyproject.toml

# 使用 uv pip install(临时安装)
uv pip install jupyter
# 只安装,不记录依赖

  • 项目开发:优先使用 uv add 来管理依赖
  • 临时/工具安装:使用 uv pip install
  • 生产部署:使用 uv sync 根据 pyproject.toml 安装所有依赖

uv add 是更现代的项目依赖管理方式,符合 Python 打包标准。

区分开发和生产环境

还有一个比较常用的功能是区分开发环境生产环境的依赖,这个功能在NodeJSRust中很常见。

比如,我们想把pandas安装到开发环境中,而把requests安装到生产环境中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$  uv add --group dev pandas
Resolved 7 packages in 1.72s
Installed 6 packages in 1.39s
+ numpy==2.2.1
+ pandas==2.2.3
+ python-dateutil==2.9.0.post0
+ pytz==2024.2
+ six==1.17.0
+ tzdata==2024.2

$ uv add --group production requests
Resolved 12 packages in 2.72s
Prepared 5 packages in 1.31s
Installed 5 packages in 68ms
+ certifi==2024.12.14
+ charset-normalizer==3.4.1
+ idna==3.10
+ requests==2.32.3
+ urllib3==2.3.0

安装之后,uv.lock 文件自动添加了各个包及其依赖,这里不再赘述。

从项目的pyproject.toml中可以看出不同环境的包依赖。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$  cat .\pyproject.toml
[project]
name = "myproject"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.12"
dependencies = []

[dependency-groups]
dev = [
"pandas>=2.2.3",
]
production = [
"requests>=2.32.3",
]

使用工具

UV 提供了强大的工具管理功能,可以替代 pipx 等工具来运行和管理 Python 工具。

运行工具(不安装)

uvx 命令可以在不安装工具的情况下直接运行工具:

1
2
3
4
5
6
7
8
9
10
# 运行带参数的工具
uvx pycowsay "Hello from UV"
-------------
< Hello from UV >
-------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||

运行 ruff 代码检查工具

1
2
3
4
5
6
# 运行 ruff 代码检查工具
uvx ruff check .
# All checks passed!

uv tool run ruff check .
# All checks passed!

注意:uvxuv tool run 的便捷别名。使用 uvx 运行的工具会在临时的隔离环境中安装和运行。

指定工具版本

可以使用 @ 语法指定工具的版本:

1
2
3
4
5
# 运行特定版本的工具
uvx ruff@0.1.5 check .

# 运行最新版本的工具
uvx ruff@latest check .

也可以使用 --from 选项指定更复杂的版本约束:

1
2
# 指定版本范围
uvx --from 'ruff>0.2.0,<0.3.0' ruff check .
安装工具

如果经常使用某个工具,可以将其安装到持久环境中,并添加到 PATH 中:

1
2
3
4
5
6
7
8
# 安装 ruff 工具
uv tool install ruff

# 安装特定版本的工具
uv tool install 'ruff>=0.3.0'

# 从 Git 仓库安装工具
uv tool install git+https://github.com/astral-sh/ruff

安装工具后,可以直接在命令行中运行该工具,无需通过 UV 调用:

1
2
# 直接运行已安装的工具
ruff --version

注意:与 uv pip install 不同,安装工具不会在当前环境中提供其模块。这种隔离对于减少工具、脚本和项目之间的依赖冲突非常重要。

升级工具

使用 uv tool upgrade 命令可以升级已安装的工具:

1
2
3
4
5
# 升级特定工具
uv tool upgrade ruff

# 升级所有工具
uv tool upgrade --all

工具升级会尊重安装工具时提供的版本约束。例如,如果使用 uv tool install ruff >=0.3,<0.4 安装了 Ruff,然后运行 uv tool upgrade ruff,则将升级 Ruff 到 >=0.3,<0.4 范围内的最新版本。

使用插件和额外依赖

可以使用 --with 选项添加额外的依赖或插件:

1
2
3
4
5
# 运行带插件的工具
uvx --with mkdocs-material mkdocs serve

# 安装带插件的工具
uv tool install mkdocs --with mkdocs-material

使用 --from 选项可以运行带有额外功能的工具:

1
2
# 使用额外功能
uvx --from 'mypy[faster-cache,reports]' mypy --xml-report mypy_report

这些命令使 UV 成为一个强大的 Python 工具管理器,可以替代 pipx 和其他类似工具,并且提供了更高的性能和更多的功能。

uv cache-缓存

uv有一个顶级命令uv cache,用于cache的管理。

首先类似pip cache dir ,uv也有一个cache dir命令来查看缓存目录:

1
2
$ uv cache dir
/home/gitpod/.cache/uv

注意不同系统的默认cache目录是不同的,我的观察是: + Linux: $HOME/.cache/uv + macOS: /Users/<user>/Library/Caches/uv + Windows: C:/Users/<user>/AppData/Local/uv/cache

当然是可以修改cache目录的,指定UV_CACHE_DIR 环境变量就可以。

然后可以用uv cache prune 清除没有用到的缓存数据,比如删除包后,可以用此命令来清除空间。

最后可以彻底地删除cache,命令为uv cache clean,整个cache目录都会被清除掉:

1
2
3
$ uv cache clean
Clearing cache at: /home/gitpod/.cache/uv
Removed 78 files (16.7MiB)

环境变量

UV支持一些环境变量的设置,例如缓存目录,index-url等,常见的包括下面这些,这些环境变量可以临时使用,不过建议时加入到你的shell到配置文件,就不用每次都敲一遍。可以复制下面的代码到.bashrc中然后修改对应的变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 缓存目录
export UV_CACHE_DIR=/path/to/cache/dir

# 镜像地址
export UV_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple

# 额外镜像地址
export EXTRA_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple

# 不用缓存
export UV_NO_CACHE=0

# 下载包时的超时时间,单位为秒
UV_HTTP_TIMEOUT=60

Docker

UV 提供了多種 Docker 映像,支持在容器化環境中使用。這對於 CI/CD 流程和確保構建環境一致性特別有用。

可以使用預安裝 UV 的映像:

1
$ docker run --rm -it ghcr.io/astral-sh/uv:debian uv --help

或者將 UV 二進制文件複製到自己的映像中:

1
2
FROM python:3.12-slim-bookworm
COPY --from=ghcr.io/astral-sh/uv:0.6.6 /uv /uvx /bin/

内部原理

UV 的出色性能不仅仅是因为它使用 Rust 语言开发,更在于其内部实现了多种高效的算法和优化策略。下面我们将揭开 UV 的核心技术原理。

依赖解析器

UV 使用基于 PubGrub 算法的依赖解析器,这是一种增量版本求解器。与传统的 SAT 求解器不同,UV 的解析器具有以下特点:

  1. 增量解析:从一个部分解决方案开始,逐步选择包版本,而不是尝试所有可能的组合。
  2. 智能优先级:包的选择基于优先级系统,URL 包优先级最高,然后是精确版本说明符,再然后是宽松说明符。
  3. 版本偏好:优先使用锁文件和当前环境中的版本,以及最高版本(除非指定其他解析策略)。
  4. 预取优化:在后台预取包的元数据,显著提高性能。
  5. 智能回溯:当检测到冲突时,解析器会进行回溯,并记录不兼容项,以避免重复尝试无效组合。
  6. 有意义的错误报告:当解析失败时,提供清晰的错误跟踪,指出冲突的具体包和版本。

分叉解析

UV 采用了分叉解析器策略,可以处理不同环境下的矛盾需求:

  1. 条件依赖:当包有多个带有不同标记的要求时(如基于 Python 版本或操作系统的条件),解析会被分割。
  2. 智能合并:具有相同包的分叉会合并,以保持分叉数量较少。
  3. 锁文件稳定性:锁文件中会记录分叉信息,确保解析稳定性。

Python 版本兼容性

UV 严格处理 Python 版本兼容性,确保所有依赖项都能在指定的 Python 版本上正确安装:

  1. 最低版本传播:如果项目要求 Python >= 3.9,那么声明了 Python >= 3.10 的包版本会被拒绝。
  2. 版本下限尊重:为了简化和向前兼容,只会尊重 requires-python 中的下限。

性能优化

UV 的高性能来自于多方面的优化:

  1. Rust 实现:使用 Rust 语言开发,具有出色的性能和内存安全性。
  2. 并行下载:并行处理包下载和元数据获取。
  3. 智能缓存:全局缓存机制避免重复下载和安装相同的包。
  4. 最小化磁盘操作:优化的文件操作和磁盘访问模式。
  5. 增量处理:在解析和安装过程中采用增量方法,避免不必要的全量重建。

这些内部原理使 UV 能够在保持兼容性的同时,实现比传统工具快 10-100 倍的性能。对于大型项目和复杂依赖关系,这些优化尤为重要。

速查表

下面是 UV 工作流程中的常见操作速查表,帮助您快速查找和使用 UV 的各种命令。

环境管理

操作 UV 命令 传统对应命令
创建虚拟环境 uv venv python -m venv .venv
创建指定 Python 版本的虚拟环境 uv venv --python=3.10 python3.10 -m venv .venv
安装 Python 版本 uv python install 3.10 使用 pyenv 或系统包管理器
列出可用的 Python 版本 uv python list pyenv versions
激活虚拟环境 使用系统激活方式 source .venv/bin/activate

包管理

操作 UV 命令 传统对应命令
安装单个包 uv pip install requests pip install requests
从 requirements.txt 安装 uv pip install -r requirements.txt pip install -r requirements.txt
安装当前项目 uv pip install -e . pip install -e .
安装开发依赖 uv pip install -e ".[dev]" pip install -e ".[dev]"
生成锁文件 uv pip compile requirements.in -o requirements.txt pip-compile requirements.in -o requirements.txt
升级单个包 uv pip install --upgrade requests pip install --upgrade requests

项目管理

操作 UV 命令 传统对应命令
添加依赖 uv add requests Poetry: poetry add requests
移除依赖 uv remove requests Poetry: poetry remove requests
同步环境 uv sync Poetry: poetry install
升级特定包 uv sync --upgrade-package requests Poetry: poetry update requests
升级所有包 uv lock --upgrade Poetry: poetry update
运行脚本 uv run python script.py Poetry: poetry run python script.py
构建项目 uv build Poetry: poetry build

工具管理

操作 UV 命令 传统对应命令
运行工具(不安装) uvx ruff check . pipx: pipx run ruff check .
运行特定版本工具 uvx ruff@0.1.5 check . pipx: pipx run --spec=ruff==0.1.5 ruff check .
安装工具 uv tool install ruff pipx: pipx install ruff
升级工具 uv tool upgrade ruff pipx: pipx upgrade ruff
升级所有工具 uv tool upgrade --all pipx: pipx upgrade-all

参考资料

文章链接:
https://www.zywvvd.com/notes/coding/python/python-uv-tool/python-uv-tool/