Сообщить об ошибке.

Среда кода верхнего уровня '__main__'

Выполнение сценариев в модулях

Модуль может определить, выполняется ли он в основной области видимости, проверив свое собственное __name__, что позволяет использовать общую идиому для условного выполнения кода в модуле, когда он выполняется как сценарий или скрипт с параметром python -m foo.py, но не при импорте import:

if __name__ == "__main__":
    # выполнить только в том случае, 
    # если выполняется как сценарий
    main()

Для пакета тот же эффект может быть достигнут путем включения файла __main__.py, содержимое которого будет выполнено при запуске пакета с параметром -m.

name == "main"

Когда модуль или пакет 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]