Python Glossary English

все Python 3Модули и импортконструкция

if __name__ == "__main__":

запуск

Защита кода, который должен работать только при запуске файла как программы (python file.py или python -m mod), но не при его импорте.

Синтаксис

def main():
    ...

if __name__ == "__main__":
    main()

Python сам кладёт в __name__ имя модуля при импорте ('tool', 'pkg.tool') и строку '__main__' — у файла, запущенного напрямую или через python -m. Без защиты весь код верхнего уровня выполняется при любом import: тесты, импортирующие ваш скрипт, или соседний модуль, которому нужна одна функция, внезапно запускают всю программу — с input(), записью файлов и долгими расчётами. multiprocessing на Windows и macOS запускает дочерние процессы методом spawn: каждый ребёнок заново импортирует главный модуль, и без защиты процессы порождаются рекурсивно, а Python падает с RuntimeError. Под защиту обычно кладут один вызов main(), чтобы логику можно было импортировать и проверить по отдельности.

Примеры

import sys
sys.path.insert(0, '.')  # искать модули и в текущем каталоге
with open('tool.py', 'w', encoding='utf-8') as f:
    f.write("def main():\n    print('программа запущена')\n"
            "print('__name__ =', __name__)\n"
            "if __name__ == '__main__':\n    main()\n")
import tool  # → __name__ = tool — а main() под защитой не вызвана
print(__name__)  # → __main__ — этот файл запущен как программа
tool.main()  # → программа запущена — функцию можно вызвать явно

См. также

Открыть в полном глоссарииdocs.python.orgСообщить о неточности