UV简介
UV 是由 Astral 团队使用 Rust 编写开发的极快速的 Python 包和项目管理工具。它集成了多种常用 Python 工具(如 pip、pip-tools、poetry、pyenv 等)的功能,提供了一个统一的工具来管理项目依赖、环境、脚本和 Python 版本。
UV官网文档:docs.astral.sh/uv/
UV功能
- 管理 Python 版本,快速切换不同版本
- 运行和安装 Python 包中的工具
- 支持单文件脚本的依赖管理和运行
安装
# MacOS and Linux
$ curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows
$ powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
基本使用
查看帮助文档
在命令行终端输入 uv --help 查看帮助文档
- run:运行命令或脚本
- init:创建一个python项目
- add:添加项目依赖
- remove:移除项目依赖
- sync: 更新项目环境
- lock:更新项目lock文件
- export:将项目的lock文件导出为其他格式
- tree:显示项目依赖树
- tool:运行并安装 Python 包提供的命令
- python:管理和安装 Python 版本
- pip:管理与 pip 兼容的界面管理 Python 包
- venv:创建虚拟环境
- build:将 Python 包构建为源码分发包和组件
- publish:将分发包上传到包管理平台
- cache:管理UV缓存
- self:管理 uv 可执行文件
- version:查看uv版本
- help:帮助命令
创建项目
创建项目格式:uv init 项目名
# 初始化项目,
$ uv init example
# 初始化项目同时指定python版本
$ uv init example -p 3.11.10
创建完成后,将会得到一个如下结构的项目
.
├── .python-version # 项目使用的python版本
├── README.md # 项目描述文件
├── hello.py
└── pyproject.toml # 项目配置文件,名称、版本、依赖
项目依赖
- 添加项目依赖格式: uv add 包名
- 移除项目依赖格式:uv remove 包名
# 添加项目依赖
$ uv add ruff
# 一次添加多个依赖项
$ uv add ruff httpx
# 向脚本添加隔离依赖项
$ uv add --script example.py requests
# 移除项目依赖
$ uv remove ruff
# 向脚本移除隔离依赖项
$ uv remove --script example.py requests
指定镜像源
常用的指定镜像源的方式有两种,一种是在命令中指定,一种是在项目配置中指定
# 指定默认镜像源为清华源
$ uv add pandas --default-index https://pypi.tuna.tsinghua.edu.cn/simple
# 添加镜像源清华源
$ uv add pandas --index https://pypi.tuna.tsinghua.edu.cn/simple
# 为pip指定默认源为南京大学源
$ uv pip install torch torchvision torchaudio --default-index https://mirror.nju.edu.cn/pytorch/whl/cu126
也可以在项目中的 pyproject.toml 文件中添加如下配置:
[[index]]
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
default = true
项目配置
同步项目环境,这对于下载别人的项目和更新、下载依赖库很重要
# 更新项目环境
$ uv sync
# 更新项目lock文件
$ uv lock
# 显示项目依赖树
$ uv tree
# 将项目的lock文件导出为其他格式
$ uv export
项目及依赖运行
运行依赖库命令
# 运行项目依赖脚本
$ uv run ruff check
运行项目
$ uv run main.py
运行指定Python版本
# 运行指定Python版本
$ uv run --python pypy@3.8 -- python
运行独立脚本(不带pyproject.toml 目录的项目)
$ uv run --no-project example.py
Tools工具
tool命令提供了全局python终端命令的管理:
- run:运行python包命令,相当于uvx
- install:安装python包命令,相当于npm、pip
- uninstall:python包命令
- upgrade:更新python包命令版本
- list:查看已安装的python包命令
- update-shell:确保工具可执行文件目录在 PATH 环境变量中
- dir:显示uv工具目录的路径
# 运行python包命令
$ uv tool run pycowsay 'hello world!'
# 安装全局命令行
$ uv tool install ruff
# 安装全局命令行
$ uv tool uninstall ruff
# 查看已安装工具列表
$ uv tool list
# 检查可执行目录是否在环境变量中
$ uv tool update-shell
# 查看uv tool安装目录
$ uv tool dir
# 输出结果:/Users/username/.local/share/uv/tools
UVX
uvx类似 pipx 和 npx 用于在临时环境中执行并安装 Python 包提供的命令行工具,uvx是命令 uv tool run 的别名
$ uvx pycowsay 'hello world!'
Python版本管理
uv 安装 Python 并允许在版本之间快速切换, 命令格式:uv python install python指定版本
# 安装指定版本
$ uv python install 3.10
# 安装多个版本
$ uv python install 3.10 3.11 3.12
# 安装一个替代python实现,例如pypy
$ uv python install pypy@3.10
# 重新安装uv托管的python版本
$ uv python install --reinstall
# 查看可用的python版本
$ uv python list
# 查找已安装的Python的安装路径
$ uv python find 3.10
# 固定当前项目以使用特定的python版本
$ uv python pin 3.12
# 卸载指定python版本
$ uv python uninstall 3.12
Pip依赖包管理
手动管理环境和包 — 旨在用于传统工作流程或高级命令无法提供足够控制的情况
pip命令提供了针对项目的python终端命令的管理:
- compile:将一个 requirements 文件编译 requirements.txt 文件
- sync:与 requirements.txt 文件同步环境
- install:安装python包命令
- uninstall:卸载python包命令
- freeze:以 requirements 格式列出环境中安装的包
- list:以 tabular 格式列出环境中安装的包
- show:显示一个或多个已安装包的信息
- tree:显示环境的依赖树
- check:验证已安装的包具有兼容的依赖项
# 同步安装环境
$ uv pip sync
# 安装python包
$ uv pip install ruff
# 卸载python包
$ uv pip uninstall ruff
# 显示已安装包
$ uv pip freeze
# 显示已安装包
$ uv pip list
# 显示环境的依赖树
$ uv pip tree
Python虚拟环境
创建虚拟环境
# 创建虚拟环境
$ uv venv
# 激活虚拟环境
$ source .venv/bin/activate
# 停用环境
$ deactivate
使用指定Python版本
$ uv venv --python 3.12.0
VU缓存
管理和检查 uv 的状态,例如缓存、存储目录
# 删除缓存条目
$ uv cache clean
# 删除过时的缓存条目
$ uv cache prune
# 显示 uv 缓存目录路径
$ uv cache dir
更新VU
用于更新uv工具自身版本
# 将UV更新到最新版本
$ uv self update
编译发布
uv build 可用于为您的项目构建源代码分发和二进制分发。默认情况下,uv build 将在当前目录中构建项目,并将构建的工件放在 dist/ 子目录中
# 为项目构建包
$ uv build
# 发布包
$ uv publish
简单案例
为Python脚本指定依赖库,在命令行终端执行如下指令
$ echo 'import requests; print(requests.get("https://astral.sh"))' > example.py
$ uv add --script example.py requests
上面指令会创建一个 example.py 文件并在脚本文件中添加 requests 隔离依赖(该依赖只会在该文件中出现,不会添加到项目配置中)
# /// script
# requires-python = ">=3.10"
# dependencies = [
# "requests",
# ]
# ///
import requests; print(requests.get("https://astral.sh"))
在隔离的虚拟环境中运行脚本
$ uv run example.py
常见问题
uv add、uv pip和uv tool install的区别
- uv add:用于向当前项目添加依赖,并自动更新 pyproject.toml 文件
- uv pip:用于管理项目环境中的依赖,提供与 pip 高度兼容的接口,用于手动管理环境中的包,不会更新 pyproject.toml 文件
- uv tool install:用于全局安装 Python 命令行工具(如 ruff、black 等),类似于 pipx 和 pip install
UV可以管理全局python版本吗?
UV用于指定和管理运行命令行或者项目中的Python版本,不能管理全局Python版本
友情提示
见原文:【Python】Python 版本、项目、包、管理工具UV
本文同步自微信公众号 "程序员小溪" ,这里只是同步,想看及时消息请移步我的公众号,不定时更新我的学习经验。