[Перевод] Используйте __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 будет выполняться автоматически.