Python项目环境管理工具:uv

Keywords: #技术 #Python #uv
Release Date: 2025-05-26
Table of Contents

uv 是一个方便高效的 Python 包和项目管理工具,用 Rust 编写。类似于 npm 和 cargo 等工具.可以代替 pippip-toolspipxpoetrypyenvtwinevirtualenv 等工具,用于管理项目中的依赖包和虚拟环境。并且由于原理不同,uv 下载导入包的速度比 pip 快 10 到 100 倍。

安装

Windows:

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

macOS 和 Linux:

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

卸载

清除存储的数据(可选)

uv cache clean
rm -r "$(uv python dir)"
rm -r "$(uv tool dir)"

删除 uv 二进制文件

Windows:

rm $HOME\.local\bin\uv.exe
rm $HOME\.local\bin\uvx.exe

macOS 和 Linux:

rm ~/.local/bin/uv ~/.local/bin/uvx

使用

安装后,可以在命令行中输入 uv 来检验是否安装成功。

python 版本管理

uv python install 3.11 3.12  # 安装指定版本的python(可多个)
uv python list       # 查看可安装的 python 版本
uv python find       # 查找已安装的 Python 版本
uv python pin        # 将当前项目锁定为使用特定的 Python 版本
uv python uninstall  # 卸载 Python 版本
uv python install pypy@3.10  # 安装pypy版本的python

管理单个脚本(不常用)

创建单个 python 脚本

uv init --script example.py --python 3.12  # 指定脚本名称和python版本

运行无外部依赖包的脚本

uv run example.py  # 运行没有外部依赖包的脚本
uv run --no-project example.py  # 不使用 pyproject.toml 中的依赖
uv run --python 3.10 example.py  # 使用指定版本 python 运行脚本

运行有外部依赖包的脚本

uv run --with rich example.py  # 运行脚本时,使用 rich 依赖包

--with 可以使用多次,用于请求多个依赖包。

除了在运行时指定依赖包,也可以提前声明脚本依赖

uv add --script example.py 'requests<3' 'rich'

这会在脚本顶部添加一个 script 部分的注释,使用 toml 格式声明。

# /// script
# dependencies = [
#   "requests<3",
#   "rich",
# ]
# ///

import requests
from rich.pretty import pprint

resp = requests.get("https://peps.python.org/api/peps.json")
data = resp.json()
pprint([(k, v["title"]) for k, v in data.items()][:10])
uv remove --script example.py 'rich'  # 从脚本中移除依赖

这种依赖管理方式,对于单个脚本来说比较繁琐,因此不常用。uv 还是多用于管理整个 python 项目。

管理整个项目(常用)

uv 管理一个 python 项目,依靠的是项目中的 pyproject.toml 文件,其中保存着项目的所有配置信息,uv 会自动维护它。

uv init     # 创建一个 python 项目
uv add      # 添加一个依赖项到项目中
uv remove   # 从项目中移除一个依赖项
uv sync     # 同步项目的依赖项与环境
uv lock     # 为项目的依赖项创建一个锁定文件
uv run      # 在项目环境中运行一个命令
uv tree     # 查看项目的依赖树
uv build    # 将项目构建为分发存档
uv publish  # 将项目发布到包索引

创建一个 python 项目

uv init hello-world  # 创建一个hello-world文件夹并初始化

# 等同于

mkdir hello-world
cd hello-world
uv init

也可以通过 --python 3.14 来指定 python 版本。

uv 会创建以下文件:

.
├── .git
├── .python-version
├── README.md
├── main.py
└── pyproject.toml

首次运行项目命令(如 uv.lockuv runuv sync 或 uv lock)时,uv 还会在项目根目录下创建一个虚拟环境(.venv)和一个 uv.lock 文件。

  • pyproject.toml 包含关于你的项目的元数据
  • .python-version 包含项目的默认 Python 版本
  • .venv 文件夹包含您的项目的虚拟环境
  • uv.lock 是一个跨平台的锁定文件,包含关于项目依赖项的精确信息(本质是 TOML 文件)

添加一个依赖到项目中

uv add requests  # 添加 requests 依赖
uv add 'requests==2.31.0'  # 指定 requests 的版本
uv add git+https://github.com/psf/requests  # 指定依赖的来源地址
uv add -r requirements.txt -c constraints.txt  # 从 requirements.txt 迁移依赖

从项目中移除一个依赖

uv remove requests  # 移除 requests 依赖

要升级一个包,运行 uv lock 并带上 --upgrade-package 标志:

uv lock --upgrade-package requests

运行项目

uv run main.py  # 运行脚本
uv add flask
uv run -- flask run -p 3000  # 运行项目命令

在每次调用 uv run 之前,uv 都会验证锁文件与 pyproject.toml 一致,并且环境与锁文件一致,从而无需手动干预即可保持项目同步。 uv run 确保您的命令在一致且锁定的环境中运行。

或者,也可以使用 uv sync 手动更新环境,然后激活它再执行命令:

uv sync
.venv\Scripts\activate
flask run -p 3000
python example.py

构建分发包

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

默认情况下, uv build 将在当前目录构建项目,并将构建产物放在一个名为 dist/ 的子目录中:

uv build
ls dist/
hello-world-0.1.0-py3-none-any.whl
hello-world-0.1.0.tar.gz

使用命令行工具

python 中有许多工具,如用于测试的 pytest,用于检查格式的 ruff,都是命令行工具的形式,不需要在前面使用 python。这些工具同样也可以直接在 uv 中管理和使用。

uv tool run         # 在临时环境中运行工具
uvx == uv tool run  # uvx 是 uv tool run 的别名

使用 uvx 时,工具会安装到临时且隔离的环境中。

uv tool install       # 在用户范围内安装一个工具
uv tool uninstall     # 卸载一个工具
uv tool list          # 列出已安装的工具
uv tool update-shell  # 更新 shell 以包含工具可执行文件

例如:

uv tool install pytest
uv tool run pytest
uv tool unistall pytest

pip 接口

uv 也可以直接使用 pip 的命令接口,用于手动管理环境和包。

uv venv           # 创建一个新的虚拟环境
uv pip install    # 将包安装到当前环境
uv pip show       # 显示已安装包的详细信息
uv pip freeze     # 列出已安装的包及其版本
uv pip check      # 检查当前环境是否包含兼容的包
uv pip list       # 列出已安装的包
uv pip uninstall  # 卸载软件包
uv pip tree       # 查看环境的依赖树