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

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__
Я запущен как главная программа!

Импорт из другого процесса:

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)48 — require.main и import.metarequire.main === module, ESM + import.meta.url
Java40 — public static void mainpublic static void main(String[] args)
C#49 — Main и top-level statementsProgram.cs, OutputType Exe vs Library
Go40 — package mainpackage main + func main()
Rust40 — fn main()src/main.rs vs src/lib.rs
Kotlin40 — fun main()fun main() на JVM
Ruby40 — FILE == $0if __FILE__ == $0
PHP40 — index.php и requirepublic/index.php, чистые include

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

ТемаСтатья
Установка, первая print, IDE16 — Первая программа
Задачи ЕГЭ и олимпиад (скрипт целиком)Lab / 1122 — Алгоритмы на Python
Импорт, sys.path, .pyc11 — Архитектура CPython
Зависимости и venv39 — requirements.txt
Функции и области видимости24 — Функции

См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").