Перейти к основному содержимому

if name == "main" — точка входа при запуске файла

Разработчику

Конструкция if __name__ == "__main__": встречается почти в каждом учебном примере и во многих реальных проектах. Она отделяет код, который должен выполниться при запуске файла, от определений, которые другие программы могут импортировать.

См. также: Первая программа · жизненный цикл модуля · шаблон скрипта в обзоре языка · пример с requests.


Что делает эта конструкция​

Проверка отвечает на один вопрос: файл запущен как главная программа или подключён как модуль.

Переменная / значениеСмысл
__name__Специальная строковая переменная, которую Python задаёт каждому файлу при загрузке
"__main__"Значение __name__, когда файл запускают напрямую: python script.py
Имя файла без .pyЗначение __name__, когда файл импортируют: import script

При импорте интерпретатор выполняет весь код верхнего уровня модуля — определения функций, классов и любые инструкции вне функций. Блок под if __name__ == "__main__": выполняется только при прямом запуске.


Простой пример​

Файл test.py:

print(f"Меня зовут {__name__}")

if __name__ == "__main__":
print("Я запущен как главная программа!")
else:
print("Меня импортировали как модуль")

Прямой запуск:

python test.py
Меня зовут __main__
Я запущен как главная программа!

Импорт из другого процесса (флаг -c — выполнить строку кода без .py-файла; для проверки среды достаточно python -c "print('ok')"):

python -c "import test"
Меня зовут test
Меня импортировали как модуль

Ветка else в учебных примерах часто опускают — достаточно блока if __name__ == "__main__": с нужным кодом.


Зачем это нужно​

Представьте файл с полезными функциями и демонстрацией внизу:

# calculator.py — без проверки __name__
def add(a, b):
return a + b

def multiply(a, b):
return a * b

print(add(5, 3))
print(multiply(4, 2))

При import calculator из другой программы интерпретатор сразу выполнит print — на экран уйдут 8 и 8, хотя вы могли хотеть только вызвать calculator.add(10, 20).

С проверкой демонстрация живёт в точке входа:

# calculator.py
def add(a, b):
return a + b

def multiply(a, b):
return a * b

if __name__ == "__main__":
print(add(5, 3))
print(multiply(4, 2))
Способ запускаПоведение
python calculator.pyПоказывает демонстрацию — удобно для ручной проверки
import calculator в main.pyИмпортирует функции без лишнего вывода

Тот же приём используют во Flask, Tkinter (примеры GUI), играх на Pygame, готовых мини-играх Pygame, Panda3D и в практикуме игр:

if __name__ == "__main__":
app = App()
app.run()

Без проверки импорт файла с классом App мог бы сразу открыть окно или запустить игровой цикл.


Импорт и "код верхнего уровня"​

При загрузке модуля Python проходит цепочку Load → Compile → Execute (см. жизненный цикл кода). На этапе Execute выполняется каждая строка вне функций и классов.

# game.py — без if __name__ == "__main__"
class Game:
def __init__(self):
print("Игра создана")

def start(self):
print("Игра запущена")

print("Создаю игру...")
game = Game()
game.start()

Строка import game в другом файле создаст объект и запустит игру — обычно это нежелательно.

Вариант с точкой входа:

class Game:
def __init__(self):
print("Игра создана")

def start(self):
print("Игра запущена")

if __name__ == "__main__":
print("Создаю игру...")
game = Game()
game.start()

Теперь from game import Game даёт только класс; запуск — через python game.py.

Связь с функцией main()

Часто логику запуска выносят в def main():, а в блоке if name == "main": вызывают main(). Так проще тестировать и читать файл — см. примеры в Первой программе (VS Code, PyCharm).


Аналогия​

Файл Python можно представить как повара с рецептами (функции и классы).

  • При __name__ == "__main__" повар готовит своё блюдо для себя — это главная программа.
  • При импорте повара зовут на чужую кухню — он отдаёт рецепты и инструменты, но своё демо-блюдо не готовит, пока его явно не попросят через прямой запуск файла.

Когда писать проверку​

СитуацияНужен ли блок
Файл только для python script.py, никогда не импортируютМожно обойтись без него
Одноразовый скрипт "на сегодня"По желанию
Библиотека, общий модуль, код для другихДа
Демо, тесты или CLI в том же файле, что и функцииДа
Автопроверка домашних заданий (import student_module)Да
Единственный main.py всего приложенияЧасто достаточно кода без обёртки, но привычка полезна
Хорошая привычка

Даже в простых скриптах блок if name == "main": делает файл гибче: завтра его можно импортировать, не переписывая структуру. В учебных проектах PyCharm и VS Code часто добавляют этот шаблон автоматически.


Не путать с другими "main"​

КонтекстЧто это
if __name__ == "__main__":Условие "файл запущен напрямую"
python -m http.serverЗапуск пакета через его __main__.py — см. Первую программу
Flask(__name__)Имя текущего модуля для поиска шаблонов — другое использование той же переменной
logging.getLogger(__name__)Имя модуля в логах — тоже __name__, но без сравнения с "__main__"

Кратко​

  1. __name__ — имя модуля; при python file.py оно равно "__main__".
  2. if __name__ == "__main__": — код ниже выполняется только при прямом запуске файла.
  3. Импорт выполняет определения и весь код верхнего уровня вне этого блока.
  4. Пишите проверку, когда файл содержит переиспользуемые функции или классы и при этом демо, CLI или запуск приложения.

В других языках​

Тот же вопрос — "запускать демо/CLI или только отдавать API" — решают по-разному:

ЯзыкСтатьяМеханизм
JavaScript (Node)Точка входа в Node.js — require.main и import.meta — require.main и import.metarequire.main === module, ESM + import.meta.url
Javapublic static void main — точка входа JVM — public static void mainpublic static void main(String[] args)
C#Main и top-level statements — точка входа в .NET — Main и top-level statementsProgram.cs, OutputType Exe vs Library
Gopackage main и func main() — исполняемая программа Go — package mainpackage main + func main()
Rustfn main() — бинарный crate и библиотека Rust — fn main()src/main.rs vs src/lib.rs
Kotlinfun main() — точка входа Kotlin — fun main()fun main() на JVM
Rubyif FILE == $0 — запуск скрипта и require — FILE == $0if __FILE__ == $0
PHPindex.php и require — точка входа и подключение — index.php и requirepublic/index.php, чистые include

Дальше по разделу​

ТемаСтатья
Установка, первая print, IDEПервая программа на Python — Первая программа
Задачи ЕГЭ и олимпиад (скрипт целиком)Lab / 1122 — Алгоритмы на Python
Импорт, sys.path, .pycАрхитектура интерпретатора Python — Архитектура CPython
Зависимости и venvЗависимости Python — requirements.txt, pyproject.toml и pip — requirements.txt
Функции и области видимостиФункции - определение, аргументы, возврат значений — Функции