作者经常用 Python 写命令行脚本处理日常任务,容易将单文件 Python 命令行脚本放入~/bin
目录。但脚本若依赖 Python 标准库之外的东西就不那么容易了。最近开始用uv
来解决 Python“自动管理依赖”的问题。
- 无依赖脚本:通常通过添加合适的
shebang
行、设置可执行位并将脚本放入PATH
变量指定的目录来使其在系统任何地方可用,如一个打印 80 个 0 的脚本。 - 有依赖脚本的问题:以一个视频音频归一化脚本为例,它依赖
ffmpeg-normalize
包和ffmpeg
工具。可以选择创建虚拟环境安装依赖或将脚本变成可安装的 Python 包,但都有不便之处。 uv
的解决方案:uv
可在shebang
行中工作,读取 Python 文件顶部的特殊注释来确定运行脚本的 Python 版本和所需依赖。如上述音频归一化脚本使用#!/usr/bin/env -S uv run --script
和相关注释,第一次运行时uv
会创建虚拟环境安装依赖并运行脚本,之后会复用该虚拟环境。还用于caption
脚本等。uv
的应用范围:尚未完全到处使用uv
,用于创建新虚拟环境(配合--seed
和direnv
作为virtualenvwrapper
的替代),也开始用uv tool
替代pipx
,考虑用uv
替代pyenv
。uv
替代pipx
:用uv tool install
安装命令行工具,会自动为其依赖创建独立虚拟环境,如countdown-cli
。uv
替代pyenv
:用uv python install
安装 Python 版本,可通过--preview
或在~/.config/uv/uv.toml
中设置preview = true
来安装预览版本,安装后会在~/.local/bin
目录生成相应二进制文件。- 最大的收获:
uv
能让可执行脚本自动安装必要依赖,虽仍会将一些脚本打包成 Python 包,但“是否真需要将脚本变成正式包”的标准提高了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。