До недавнего времени написание «однострочных» Python‑утилит оборачивалось головной болью: нужно настраивать виртуальное окружение, докачивать зависимости, проверять соответствие версии Python… uv решила это, предложив Rust‑реализацию лёгкого, быстрого менеджера пакетов, способного:
— автоматически создавать «утилизируемые окружения»;
— скачивать нужные зависимости;
— исполнять вышеописанное и запускать сам скрипт в одну команду.
uv действительно быстр и «бросает настройку окружения в мусорную корзину» .
PEP 723: метаданные прямо в скрипте
PEP 723 — это спецификация, позволяющая внедрить информацию о зависимостях внутри самого файла скрипта. В начале файла прописывается пример:
# /// script
# requires‑python = ">=3.11"
# dependencies = [
# "requests<3",
# "rich",
# ]
# ///
Это позволяет некоторым инструментам автоматически понять, какие библиотеки и версия Python нужны, без отдельного
requirements.txt.Комбо: uv + PEP 723
Есть файл
pep.py с вышеописанным PEP‑блоком — и вот что происходит:
$ uv run pep.py
Installed 9 packages in 24ms
[('1', 'PEP Purpose…'), … ]
uv прочитывает метаданные, ставит окружение, запускает скрипт — и всё это без лишних слов.
Пример: скрипт для выкачки транскрипта YouTube
Взгляните на пример скрипта для выкачки субтитров с YouTube-видео:
#!/usr/bin/env -S uv run --script
# /// script
# requires‑python = ">=3.8"
# dependencies = ["youtube-transcript-api"]
# ///
import sys, re
…
transcript = YouTubeTranscriptApi().fetch(video_id)
print(formatter.format_transcript(transcript))
После
chmod +x ytt он запускается так:
$ ./ytt https://youtu.be/[video_id]
Installed 7 packages in 10ms
…текст транскрипта…
#основы