Что представляет собой файл
blockquote>__main__.py
для?При создании модуля Python обычно используется модуль, выполняющий некоторые функции (обычно содержащиеся в
main
функция) при запуске в качестве точки входа программы. Обычно это делается со следующей общей идиомой, расположенной в нижней части большинства файлов Python:if __name__ == '__main__': # execute only if run as the entry point into the program main()
Вы можете получить ту же семантику для пакета Python с
__main__.py
. Это приглашение оболочки linux,$
, если у вас нет Bash (или другой оболочки Posix) в Windows, просто создайте эти файлы наdemo/__
EOF`s:__.py with contents in between the $ mkdir demo $ cat > demo/__init__.py << EOF print('demo/__init__.py executed') def main(): print('main executed') EOF $ cat > demo/__main__.py << EOF print('demo/__main__.py executed') from __init__ import main main() EOF
(In в оболочке Posix / Bash вы можете сделать это без использования
<< EOF
s и окончанияEOF
s, введя Ctrl-D, символ конца файла в конце каждой команды cat)И теперь:
$ python demo demo/__main__.py executed demo/__init__.py executed main executed
Вы можете получить это из документа. В документации говорится:
__main__
- Сценарий верхнего уровня
'__main__'
- это имя области, выполняется код уровня. Модуль__name__
устанавливается равным'__main__'
при чтении со стандартного ввода, сценария или из интерактивного приглашения.Модуль может узнать, работает ли он в основной области, проверяя его собственный
__name__
, который допускает общую идиому для условного выполнения кода в модуле, когда он запускается как сценарий или сpython -m
, но не когда он импортируется:if __name__ == '__main__': # execute only if run as a script main()
Для пакета , тот же эффект может быть достигнут путем включения модуля
blockquote>__main__.py
, содержимое которого будет выполняться, когда модуль будет работать с-m
.Zipped
Вы также можете упаковать это в один файл и запустить его из командной строки, как это, но обратите внимание, что zipped-пакеты не могут выполнять подпакеты или подмодули в качестве точки входа:
$ python -m zipfile -c demozip demo/* $ python demozip demo/__main__.py executed demo/__init__.py executed main() executed