Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Poetry и скрипты Python: Настройка окружения

Когда вы разрабатываете программу для конечного пользователя, вам нужно закладывать в код точки входа и готовить модули или пакеты к запуску.

Но даже если вы все сделаете правильно, пользователю все равно придется писать длинную команду python3 -m ПОЛНОЕ_ИМЯ_МОДУЛЯ.

Чтобы упростить этот момент, разработчики оформляют свои пакеты так, чтобы пользователи могли вводить короткие команды. В Poetry такие описываемые команды называются скриптами.

Точка входа в проекте-примере

Точкой входа в программу может служить любая функция, расположенная в любом модуле. Чтобы поддерживать порядок в проекте, разместим точку входа в модуле hello.scripts.say_hello:

tree hello

hello/
├── __init__.py
└── scripts
    ├── __init__.py
    └── say_hello.py

cat hello/scripts/say_hello.py

def main():
    print("Hello!")


if __name__ == '__main__':
    main()

Проверяем, что точка входа работает при указании длинной команды:

poetry run python -m hello.scripts.say_hello

Hello!

Обычно вся сложная логика размещается где-то в библиотечном коде — в пакете hello в нашем случае. А вот в скрипты выносятся только небольшие куски кода, необходимые для запуска.

А теперь представим, что вы написали какой-то важный код в одном из модулей пакета scripts и хотите его импортировать в другие места. В этом случае стоит остановиться и подумать, а должен ли этот код вообще находиться в скрипте. Проще говоря, скрипты могут импортировать что-то из библиотеки, но не наоборот.

Описание скриптов в файле конфигурации

Теперь мы знаем, что такое скрипт — осталось научиться их писать.

Открываем файл pyproject.toml и находим секцию tool.poetry.dependencies. Сразу после нее добавляем новую секцию tool.poetry.scripts следующего вида:

[tool.poetry.scripts]
say-hello = "hello.scripts.say_hello:main"

Разберем, как устроена пара «ключ-значение»:

  • Ключ — это имя будущей короткой команды
  • Значение — полное имя модуля, двоеточие и имя объявленной функции

Обратите внимание, что команда называется say-hello, а модуль — say_hello. Дело в том, что сложносоставные имена команд принято называть через дефис, но модули Python не могут содержать этот символ в имени. Поэтому в этом случае дефис заменен на подчеркивание.

Еще не забывайте, что hello.scripts.say_hello — это полное имя модуля, которое на первый взгляд выглядит как путь hello/scripts/say_hello.py. Если вы случайно укажете путь к файлу вместо имени модуля или забудете указать имя функции, то вызов короткой команды завершится с ошибкой.

Если все описано верно, то Poetry позволит вызывать вновь объявленную короткую команду привычным способом:

poetry run say-hello

Hello!

Самостоятельная работа

  1. Ориентируясь на примеры в уроке, добавьте в проект hello модуль hello.scripts.say_hello
  2. Добейтесь того, чтобы запуск этого модуля через poetry run python -m hello.scripts.say_hello приводил к успешному выводу сообщения "Hello!"
  3. Добавьте описание скрипта say-hello в pyproject.toml
  4. Проверьте, что команда poetry run say-hello тоже выполняется успешно — выводит все то же сообщение
  5. С помощью библиотеки colorama сделайте выводимый текст красным

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
от 25 000 ₸ в месяц
Разработка веб-приложений на Django
10 месяцев
с нуля
Старт 28 ноября
профессия
от 24 542 ₸ в месяц
новый
Сбор, анализ и интерпретация данных
9 месяцев
с нуля
Старт 28 ноября

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»