带有 uv 的懒汉式自安装 Python 脚本

作者经常用 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,用于创建新虚拟环境(配合--seeddirenv作为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 包,但“是否真需要将脚本变成正式包”的标准提高了。
阅读 14
0 条评论