TGViewer
Zen of Python Zen of Python @zen_of_python · 18.8K subscribers
Post #4113 2.52K
Как обойтись без requirements.txt для скрипта-одиночки, или чем хорош uv

Стандарт PEP 723 и менеджер зависимостей uv упростили обращение со скриптами-одиночками. Теперь мы можем встраивать метаданные о зависимостях прямо в скрипты, что устраняет необходимость в requirements.txt или менеджерах пакетов.

Рассмотрим на простом примере скрипта wordlookup.py. Он извлекает определения слов из API словаря. Этот скрипт использует библиотеку httpx для выполнения асинхронных запросов. Вот как выглядит основной код:

import argparse
import asyncio
import json
import os
import textwrap
import httpx

async def fetch_word_data(word: str) -> list:
"""Получает данные слова из API словаря."""
url = f"https://api.dictionaryapi.dev/api/v2/entries/en/{word}"
async with httpx.AsyncClient() as client:
response = await client.get(url)
response.raise_for_status()
return response.json()

async def main(word: str):
"""Получает и выводит определения для данного слова."""
data = await fetch_word_data(word)
if data:
print(f"Определения для '{word}':")
for entry in data:
for meaning in entry.get("meanings", []):
part_of_speech = meaning.get("partOfSpeech")
definitions = meaning.get("definitions", [])
if part_of_speech and definitions:
print(f"\n{part_of_speech}:")
for definition_data in definitions:
definition = definition_data.get("definition")
if definition:
print(f"- {definition}")

if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Получить определения слова.")
parser.add_argument("word", type=str, help="Слово для поиска.")
args = parser.parse_args()
asyncio.run(main(args.word))

Чтобы добавить зависимость httpx в наш скрипт, мы можем использовать команду uv:

uv add --script wordlookup.py httpx

После выполнения этой команды в верхней части скрипта будут добавлены метаданные о зависимостях, что позволит uv автоматически управлять установкой необходимых библиотек при запуске скрипта.

Запускаем скрипт:

uv run wordlookup.py <слово>

При первом запуске uv создаст изолированную виртуальную среду и установит все необходимые зависимости. В дальнейшем uv будет использовать уже созданную среду.

#факт
@zen_of_python
  • 👍 5
  • 🔥 5
  • ❤ 3
More from @zen_of_python
  1. Sep 28, 2026partial или lambda: как специализировать колбэк без сюрпризов functools.partial заранее св…
  2. Sep 28, 2026Как коллизии превращают построение set в Python в квадратичную задачу Привычное O(1) для s…
  3. Sep 28, 2026Как проверять инварианты Python-кода с Hypothesis Обычный тест фиксирует конкретный ввод и…
  4. Sep 27, 2026Как запускать собственный SQL через миграции Django У models.Index нашлось необычное приме…
  5. Sep 27, 2026Как разделить синхронный и асинхронный Python-клиенты При переписывании akismet автор отка…
  6. Sep 27, 2026Как заменить цепочку isinstance на singledispatch Когда обработка типов разрастается, цепо…
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 →