Хабрахабр

[Перевод] Используйте __main__.py

Я видел немало проектов либо рабочих, либо на Github, которые не используют это магический файл, хотя могли бы сделать свою жизнь проще. Зачем нужен __init__.py знает, наверное, любой питонист, но что насчёт __main__.py? На мой взгляд, __main__.py это лучший способ для взаимодействия с питоновскими модулями, состоящими из нескольких файлов.

Но давайте сначала разберёмся: как большинство людей запускают свои скрипты на Python?

Вы скорей всего в курсе, как обычно поступают в этом случае: Однажды вы напишете программу, которую захотите использовать и как импортируемый модуль, и как инструмент запускаемый из командной строки.

if __name__ == '__main__': main(sys.argv)

Таким образом мы узнаём, что это не импорт, а именно запуск. Когда вы скармливаете скрипт интерпретатору, магическая глобальная переменная __name__ получает значение __main__. Например:

python myapp.py

И это прекрасно работает для одиночного файла.

Проблема

Разбиение логики по разным файлам упрощает редактирование и поддержку. Но если вы похожи на меня, вы не захотите, чтобы всё ваше приложение теснилось в единственном файле. Например:

.
├── README.me
├── requirements.txt
├── setup.py
└── src ├── __init__.py ├── client.py ├── logic.py ├── models.py └── run.py

Неужели run.py? Но пользователю, который склонировал проект из репозитория будет не понятно — какой из этих файлов главный? Где же искать знакомую строку if __name__ == '__main__'? А может client.py? Вот здесь-то __main__.py и способен проявить себя.

__main__.py

И это весьма удобно, если код предназначен и для использования в качестве модуля, и для запуска из консоли. Файл __main__.py вызывается при запуске проекта с флагом модуля — -m. Давайте изменим проект из примера выше соответственно: Думайте об этом файле, как о месте куда можно класть всё, что вы обычно кладёте внутрь if __name__ == '__main__'.

.
├── README.me
├── requirements.txt
├── setup.py
└── myapp ├── __init__.py ├── __main__.py ├── client.py ├── logic.py ├── models.py

Теперь можно просто запускать проект как обычный модуль. И, вуаля!

python -m myapp

Это идеальное место для размещения интерфейса командной строки и обработки входных аргументов! __main__.py будет выполняться автоматически.

Показать больше

Похожие публикации

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»