Стандарт PEP 723 и менеджер зависимостей uv упростили обращение со скриптами-одиночками. Теперь мы можем встраивать метаданные о зависимостях прямо в скрипты, что устраняет необходимость в requirements.txt или менеджерах пакетов.
Рассмотрим на простом примере скрипта wordlookup.py. Он извлекает определения слов из API словаря. Этот скрипт использует библиотеку httpx для выполнения асинхронных запросов. Вот как выглядит основной код:
import argparseimport asyncioimport jsonimport osimport textwrapimport httpxasync 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