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.
Часто логику запуска выносят в 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) | 48 — require.main и import.meta | require.main === module, ESM + import.meta.url |
| Java | 40 — public static void main | public static void main(String[] args) |
| C# | 49 — Main и top-level statements | Program.cs, OutputType Exe vs Library |
| Go | 40 — package main | package main + func main() |
| Rust | 40 — fn main() | src/main.rs vs src/lib.rs |
| Kotlin | 40 — fun main() | fun main() на JVM |
| Ruby | 40 — FILE == $0 | if __FILE__ == $0 |
| PHP | 40 — index.php и require | public/index.php, чистые include |
Дальше по разделу
| Тема | Статья |
|---|---|
Установка, первая print, IDE | 16 — Первая программа |
| Задачи ЕГЭ и олимпиад (скрипт целиком) | Lab / 1122 — Алгоритмы на Python |
Импорт, sys.path, .pyc | 11 — Архитектура CPython |
| Зависимости и venv | 39 — requirements.txt |
| Функции и области видимости | 24 — Функции |
См. также
Другие статьи этого же раздела в боковом меню (как на странице "О разделе"). Python как язык общего назначения - философия, ключевые свойства и области применения в современной разработке. Python — это высокоуровневый язык программирования общего назначения, который отличается читаемым синтаксисом и широким спектром применения. Принципы, которые делают код понятным, поддерживаемым и расширяемым. Примеры реализации типовых приложений. Каждый пример сопровождается разбором ключевых концепций языка. Наверняка каждый новичок, решивший перейти в что-то стандартное в Python, открывает себе этот файл. Как устроен Python, что входит в комплект и какие есть реализации. Структурные каркасы для построения приложений, как они устроены. Фреймворки, библиотеки, инструменты сборки, среды выполнения, системы тестирования и специализированные платформы, объединённые общей философией ясности, простоты и гибкости. Что такое модули, как устроены механизмы импорта и загрузки. Управление изолированной средой и зависимостями проекта. История Python - ключевые этапы развития языка, сообщества и экосистемы инструментов. Философия Python не зафиксирована в официальных стандартах, но она глубоко интегрирована в язык, его стандартную библиотеку, документацию и культуру разработчиков.Python - язык общего назначения
Что требуется знать перед началом изучения языка программирования Python
Рекомендации по разработке на Python
Простые приложения на Python
Встроенный модуль builtins и типизация в Python
Архитектура интерпретатора Python
Фреймворки и библиотеки Python
Экосистема Python-приложений
Модули в Python
Виртуальные окружения и управление зависимостями
История языка Python
Философия Python - Zen of Python