uv库使用
简介
uv是下一代的python包管理工具,使用rust编写,现阶段主要替代pip,有一些亮点:
- 速度比pip快10~100倍
- 可以替代pip,pipx,poetry,pyenv,virtualenv等工具
- 提供项目管理,带有通用锁定文件
- 安装管理python版本
- 有一个pip兼容的接口
- 支持工作区
- 磁盘利用率高(使用全局硬连接,只会保存一份)
由此,假如需要手动编译(在没有对应平台包的情况下),需要rust编译链
用起来感觉像一个大杂烩,使用不同的子命令兼容不同的工具,基础是一个包管理器,而非环境管理器
用法
包管理和安装–替代pip–uv pip
简单替代直接使用uv pip替代pip即可:
1 | 用户级 |
uv进行的是包的隔离,其会在.uv(不在项目中)或者.venv(在项目中)中安装包,而解释器还是用的系统本身,修改PYTHONPATH进行加载
在使用uv pip install时,如果遇到需要即使编译的包,并且依赖其它环境(例如torch),会找不到包,这是由于uv默认使用了pip install --use-pep517的选项来进行build隔离,需要开发者在project.toml文件中更新支持,可以使用暂时--no-build-isolation绕过
项目管理–替代poetry
可以初始化项目,在项目内进行包管理:
1 | 初始化项目 |
在add时,会创建一个.venv来管理配置,或者自己显式创建
初始的项目具有以下结构:
1 | . |
管理全局工具–替代pipx–uv tool或者uvx
类似npm,可以管理一些全局的python工具,例如,使用black代码格式化工具:
1 | 使用uv tool进行管理 |
python版本管理–替代pyenv–uv python@
python的版本管理可以使用conda,也可以使用pyenv(不支持windows),uv可以管理多版本python
1 | 安装 |
运行脚本
可以确保无需手动管理的情况下管理脚本的依赖:
直接带依赖运行:
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 | # /// script |
就可以直接使用uv run来运行
工作区支持
略
卸载
真是从入门到卸载:
首先需要清理缓存:
1
2
3uv 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所缺少的,有很好的前景,可能对于脚本,前后端有用,至于要成为做深度学习的必备工具,只能说道阻且长吧
总结来说,以一个视觉从业者的角度来说,尽管愿景美好,现阶段还是有些华而不实