Когда вы разрабатываете программу для конечного пользователя, вам нужно закладывать в код точки входа и готовить модули или пакеты к запуску.
Но даже если вы все сделаете правильно, пользователю все равно придется писать длинную команду 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!
Самостоятельная работа
- Ориентируясь на примеры в уроке, добавьте в проект
hello
модульhello.scripts.say_hello
- Добейтесь того, чтобы запуск этого модуля через
poetry run python -m hello.scripts.say_hello
приводил к успешному выводу сообщения "Hello!" - Добавьте описание скрипта
say-hello
вpyproject.toml
- Проверьте, что команда
poetry run say-hello
тоже выполняется успешно — выводит все то же сообщение - С помощью библиотеки colorama сделайте выводимый текст красным
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.