简介

uv是下一代的python包管理工具,使用rust编写,现阶段主要替代pip,有一些亮点:

  • 速度比pip快10~100倍
  • 可以替代pip,pipx,poetry,pyenv,virtualenv等工具
  • 提供项目管理,带有通用锁定文件
  • 安装管理python版本
  • 有一个pip兼容的接口
  • 支持工作区
  • 磁盘利用率高(使用全局硬连接,只会保存一份)

由此,假如需要手动编译(在没有对应平台包的情况下),需要rust编译链

用起来感觉像一个大杂烩,使用不同的子命令兼容不同的工具,基础是一个包管理器,而非环境管理器

用法

包管理和安装–替代pipuv pip

简单替代直接使用uv pip替代pip即可:

1
2
3
4
5
6
# 用户级
uv pip install ...
uv pip list

# 可以加--system全局使用
uv pip install --system ...

uv进行的是包的隔离,其会在.uv(不在项目中)或者.venv(在项目中)中安装包,而解释器还是用的系统本身,修改PYTHONPATH进行加载

在使用uv pip install时,如果遇到需要即使编译的包,并且依赖其它环境(例如torch),会找不到包,这是由于uv默认使用了pip install --use-pep517的选项来进行build隔离,需要开发者在project.toml文件中更新支持,可以使用暂时--no-build-isolation绕过

项目管理–替代poetry

可以初始化项目,在项目内进行包管理:

1
2
3
4
5
6
7
8
# 初始化项目
uv init hello-world
cd hello-world

# 管理依赖
uv add 'requests==2.31.0' # 增加项目依赖
uv lock --upgrade-package requests # 更新项目依赖
uv remove requests # 删除项目依赖

在add时,会创建一个.venv来管理配置,或者自己显式创建

初始的项目具有以下结构:

1
2
3
4
5
6
7
8
9
10
.
├── .venv
│ ├── bin
│ ├── lib
│ └── pyvenv.cfg
├── .python-version
├── README.md
├── main.py
├── pyproject.toml
└── uv.lock

管理全局工具–替代pipxuv tool或者uvx

类似npm,可以管理一些全局的python工具,例如,使用black代码格式化工具:

1
2
3
4
5
6
# 使用uv tool进行管理
uv tool install black
uv toll run black ...

# 使用uvx进行管理
uvx black ...

python版本管理–替代pyenvuv python@

python的版本管理可以使用conda,也可以使用pyenv(不支持windows),uv可以管理多版本python

1
2
3
4
5
6
7
8
9
10
11
# 安装
uv python install python@3.12

# 查看可以使用的版本
uv python list

# 固定默认版本
uv python pin ...

# 使用指定的版本
uv python@3.12 ...

运行脚本

可以确保无需手动管理的情况下管理脚本的依赖:

  • 直接带依赖运行:uv run --with rich example.py

  • 创建脚本运行:uv init --script example.py --python 3.12,会自动包含依赖:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # /// script
    # requires-python = ">=3.13"
    # dependencies = []
    # ///


    def main() -> None:
    print("Hello from example2.py!")


    if __name__ == "__main__":
    main()

​ 也可以进行声明:uv add --index "https://example.com/simple" --script example.py 'requests<3' 'rich'

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# /// script
# requires-python = ">=3.13"
# dependencies = [
# "requests<3",
# "rich",
# ]
# [[tool.uv.index]]
# url = "https://pypi.tuna.tsinghua.edu.cn/simple"
# ///

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 run来运行

工作区支持

卸载

真是从入门到卸载:

  • 首先需要清理缓存:

    1
    2
    3
    uv cache clean
    rm -r "$(uv python dir)"
    rm -r "$(uv tool dir)"
  • 卸载:

    • 如果使用官方脚本,就直接删除文件:

      1
      rm ~/.local/bin/uv ~/.local/bin/uvx
    • 如果使用pip安装,就使用pip卸载:

      1
      pip uninstall uv
    • 另外别忘记删除uv创建的工程和.venv

总结

官方声明为下一代的python包管理工具,但是现有的定位相对尴尬:

  • 相比于conda作为一个环境隔离和管理工具,uv没有实现对应的功能,并且有许多科学计算的包包含c/c++也无法支持,现在连pytorch都只能装最新版,旧版会有各种问题
  • 其定位更接近于pip,相比于pip,速度更快,但一旦涉及到编译,就会出现各种不兼容问题,尽管很多问题也不见得是uv的问题
  • 项目管理工具,这确实是python所缺少的,有很好的前景,可能对于脚本,前后端有用,至于要成为做深度学习的必备工具,只能说道阻且长吧

总结来说,以一个视觉从业者的角度来说,尽管愿景美好,现阶段还是有些华而不实