TGViewer
Zen of Python Zen of Python @zen_of_python · 18.8K subscribers
Post #4347 2.48K
Почему вам стоит попробовать uv

До недавнего времени написание «однострочных» 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
…текст транскрипта…


#основы
  • 🔥 10
  • 👍 2
  • ❤ 1
More from @zen_of_python
  1. Sep 27, 2026Как разделить синхронный и асинхронный Python-клиенты При переписывании akismet автор отка…
  2. Sep 27, 2026Как заменить цепочку isinstance на singledispatch Когда обработка типов разрастается, цепо…
  3. Sep 26, 2026Как собирать динамические фильтры Django через Q-объекты Q() представляет условие для SQL-…
  4. Sep 26, 2026Почему str.splitlines() видит больше переносов, чем чтение файла У Python два разных понят…
  5. Sep 26, 2026Как вручную разрешить ленивый импорт в Python У объекта, созданного через lazy import json…
  6. Sep 25, 2026Почему Python предупреждает о последовательности \477 и как это исправить В строках Python…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →