Python 依赖管理工具 uv 使用笔记(“Cargo for Python”)

Published: 2024-04-30

Tags: Python

本文总阅读量

uv 是一个非常快速的 Python 依赖安装程序和分解器,使用 Rust 编写,旨在替代 pip 和pip-tools 工作流,速度比他们快 8~10 倍,当前可用于替代 pip, pip-tools, virtualenv,根据路线图,它会向着 “Cargo for Python” 方向前行 —— 一个极其快速、可靠且易于使用的综合项目和包管理器。

Github 地址:astral-sh/uv

安装 uv 工具

它是一个二进制文件,因此支持多种方式安装而不依赖 Rust 和 Python 环境(部分方式如下)

# pip
$ pip install uv

# On macOS and Linux.
curl -LsSf https://astral.sh/uv/install.sh | sh

# macOS
$ brew install uv

虚拟环境管理

创建 venv 环境

$ uv venv myenv

激活环境

$ source myenv/bin/activate

当需要指定 python 版本时候,可以通过 --python 参数指定

# uv venv --python <path to executable> myvenv
$ uv venv --python /opt/homebrew/bin/python3.8 venv-py3.8

$ source venv-py3.8/bin/activate

$ python3 --version
Python 3.8.19

退出虚拟环境

$ deactivate

安装卸载依赖

$ uv pip install requests

# 卸载
$ uv pip uninstall requests

更新单个依赖

$ uv pip install --upgrade requests

根据依赖清单安装依赖

$ uv pip install -r requirements.txt

生成 requirements.in 文件

生成 requirements.in 依赖文件,而后根据需要手动精简及调整。

$ uv pip freeze > requirements-3.in

生成、更新依赖清单

摘自 py-tools 的示例图

Requirements 清单文件可以锁定 Python 依赖包的版本

通过 requirements.in 生成 requirements.txt

$ uv pip compile requirements.in -o requirements.txt 

通过 pyproject.toml 生成 requirements.txt

$ uv pip compile pyproject.toml -o requirements.txt 

其它基于如 setup.pysetup.cfg 的生成参考 pip-tools 文档说明

更新依赖版本

全量更新

$ uv pip compile --upgrade -o requirements.txt requirements.in

只更新部分依赖

$ uv pip compile --upgrade-package flask -o requirements.txt requirements.in

备注:能否更新依赖取决于 requirements.in 等文件中有没有锁定版本。

更多关于 pip-compile 的用法示例参考 pip-tools 文档说明

安装、同步环境依赖

使用 pip-tools 的 sync,可以依据 requirements.txt 更新 site-packages 中的依赖包,让 requirements.txt 中删除了软件包,sync 后,环境中的依赖包也会被移除。

正式环境安装依赖

$ uv pip sync requirements.txt

测试环境安装依赖

$ uv pip sync requirements.txt dev-requirements.txt

其它

1. 关于命令格式 uv pip install... ?

而不是 uv install 呢?因为这两个命令有不同的语意,uv 不是 pip by rust, uv 有更广泛的用途,参考文档中的描述

By scoping these "lower-level" commands under uv pip, we retain space in the CLI for the more "opinionated" project management API we intend to ship in the future, which will look more like Rye, or Cargo, or Poetry. (Imagine uv run, uv build, and so on.)

通过在 uv pip 下确定这些“较低级别”命令的范围,在 CLI 中为团队打算在未来发布的更加 “固执己见” 的项目管理 API 保留了空间,它看起来更像 Rye、Cargo 或 Poetry。 (想象一下 uv run、uv build 等)

备注:更窄的 pip-tools 范围使得 uv 能够提供很多底层支持(例如软件包安装),同时也能很方便的提供立即有用的东西。

2. uv pip 基本可以替代 pip

While uv supports a large subset of the pip interface, it does not support the entire feature set. In some cases, those differences are intentional; in others, they're a result of uv's early stage of development.

虽然 uv 支持 pip 接口的很大一个子集,但它不支持整个功能集。在某些情况下,这些差异是有意的;在另一些情况下,它们是 uv 早期发展的结果。

更多关于 uv 的内容,可以参考:https://github.com/astral-sh/uv

参考