все 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Сообщить о неточности