Модуль может определить, выполняется ли он в основной области видимости, проверив свое собственное __name__
, что позволяет использовать общую идиому для условного выполнения кода в модуле, когда он выполняется как сценарий или скрипт с параметром python -m foo.py
, но не при импорте import
:
if __name__ == "__main__": # выполнить только в том случае, # если выполняется как сценарий main()
Для пакета тот же эффект может быть достигнут путем включения файла __main__.py
, содержимое которого будет выполнено при запуске пакета с параметром -m
.
Когда модуль или пакет Python импортируется, то __name__
присваивается имя модуля/пакета. Обычно это имя самого файла Python без расширения .py
:
>>> import configparser >>> configparser.__name__ # 'configparser'
Если файл является частью пакета, то __name__
также будет включать путь к родительскому пакету:
>>> from concurrent.futures import process >>> process.__name__ # 'concurrent.futures.process'
НО, если модуль выполняется в среде кода верхнего уровня, то его __name__
устанавливается в строку "__main__"
.
__main__
- это имя среды, в которой выполняется код верхнего уровня. "Код верхнего уровня" - это первый указанный пользователем модуль Python, который начинает работать. Это "верхний уровень", т.к. он импортирует все остальные модули, необходимые программе. Иногда "код верхнего уровня" называют точкой входа в приложение.
Среда кода верхнего уровня может быть:
область действия интерактивного приглашения:
>>> __name__ # '__main__'
модуль Python, переданный интерпретатору Python в качестве аргумента файла:
$ python3 helloworld.py # Hello, world!
модуль или пакет Python, передаваемый интерпретатору Python с аргументом -m
:
$ python3 -m tarfile # usage: tarfile.py [-h] [-v] (...)
код Python, считываемый интерпретатором Python со стандартного ввода:
$ echo "import this" | python3 # The Zen of Python, by Tim Peters
код Python, передаваемый интерпретатору Python с аргументом -c
:
$ python3 -c "import this" # The Zen of Python, by Tim Peters # # Beautiful is better than ugly. # Explicit is better than implicit. # ...
В каждой из этих ситуаций __name__
модуля верхнего уровня устанавливается равным '__main__'
.
В результате модуль может определить, запущен ли он в среде верхнего уровня, проверив свое собственное __name__
, что допускает общую идиому для условного выполнения кода, когда модуль не инициализирован из инструкции [import
][import]