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

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

Когда вы разрабатываете программу для конечного пользователя, а не библиотеку для программиста, вам так или иначе нужно закладывать в код точки входа. Но даже если подготовить какой-то модуль или пакет к запуску, то необходимость писать python3 -m ПОЛНОЕ_ИМЯ_МОДУЛЯ останется! Для того, чтобы упростить жизнь пользователю, создатели пакетов оформляют свои пакеты так, чтобы достаточно было вводить короткие команды. В poetry такие описываемые команды называются "scripts".

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

Строго говоря, точкой входа в программу может служить любая функция, расположенная в любом модуле. Но мы в Хекслете считаем, что хоть какой-то порядок стоит поддерживать там, где это возможно! Поэтому точку входа разместим в модуле 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!

asciicast


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

  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 сделайте выводимый текст красным!

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

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

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

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

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

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

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

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

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

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

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Python-разработчик
Профессия
Разработка веб-приложений на Django
7 июля 10 месяцев

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

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

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

Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»