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.
Часто логику запуска выносят в 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__" |
Кратко
__name__— имя модуля; приpython file.pyоно равно"__main__".if __name__ == "__main__":— код ниже выполняется только при прямом запуске файла.- Импорт выполняет определения и весь код верхнего уровня вне этого блока.
- Пишите проверку, когда файл содержит переиспользуемые функции или классы и при этом демо, CLI или запуск приложения.
В других языках
Тот же вопрос — "запускать демо/CLI или только отдавать API" — решают по-разному:
| Язык | Статья | Механизм |
|---|---|---|
| JavaScript (Node) | Точка входа в Node.js — require.main и import.meta — require.main и import.meta | require.main === module, ESM + import.meta.url |
| Java | public static void main — точка входа JVM — public static void main | public static void main(String[] args) |
| C# | Main и top-level statements — точка входа в .NET — Main и top-level statements | Program.cs, OutputType Exe vs Library |
| Go | package main и func main() — исполняемая программа Go — package main | package main + func main() |
| Rust | fn main() — бинарный crate и библиотека Rust — fn main() | src/main.rs vs src/lib.rs |
| Kotlin | fun main() — точка входа Kotlin — fun main() | fun main() на JVM |
| Ruby | if FILE == $0 — запуск скрипта и require — FILE == $0 | if __FILE__ == $0 |
| PHP | index.php и require — точка входа и подключение — index.php и require | public/index.php, чистые include |
Дальше по разделу
| Тема | Статья |
|---|---|
Установка, первая print, IDE | Первая программа на Python — Первая программа |
| Задачи ЕГЭ и олимпиад (скрипт целиком) | Lab / 1122 — Алгоритмы на Python |
Импорт, sys.path, .pyc | Архитектура интерпретатора Python — Архитектура CPython |
| Зависимости и venv | Зависимости Python — requirements.txt, pyproject.toml и pip — requirements.txt |
| Функции и области видимости | Функции - определение, аргументы, возврат значений — Функции |