---
title: Модули и пакеты Python
questionDates:
  q-transfer-0140: '2026-10-01'
  q-transfer-0141: '2026-10-01'
  q-transfer-0242: '2026-10-01'
seo:
  description: >-
    Тема «Модули и пакеты Python» для собеседования Python Developer. Зачем
    нужен блок if __name__ == '__main__'? Когда пакет Python может не содержать
    __init__.py?
  title: Модули и пакеты Python — Python Developer
---

[Все темы Python Developer](/prep/python-developer)

## Зачем нужен блок `if __name__ == '__main__'`? [#q-transfer-0140]

При прямом запуске файла Python задает модулю `__name__ == '__main__'`; при импорте там находится полное имя модуля. Поэтому под этим условием размещают вызов точки входа, а основную логику оставляют в функциях. Импорт тогда создает определения, но не запускает CLI, сервер или побочные записи. Для пакетов аналогичную точку входа можно оформить в `__main__.py`. Такое поведение проверяют установкой пакета в чистое окружение, где рабочий каталог не маскирует ошибки импорта.

:::note[Ссылки для изучения]

1. [Запуск модуля как скрипта и проверка `__name__ == "__main__"` — документация Python](https://docs.python.org/ru/3/tutorial/modules.html#executing-modules-as-scripts)
   :::

---

## Когда пакет Python может не содержать `__init__.py`? [#q-transfer-0141]

Обычный пакет содержит `__init__.py`; при импорте этот файл выполняется и может определять публичный интерфейс пакета. По PEP 420 возможен namespace package без `__init__.py`: его части могут лежать в нескольких каталогах пути импорта и объединяться под одним именем. Простое отсутствие файла не гарантирует успешный импорт, путь должен быть доступен импортной системе, а структура имен не должна конфликтовать. Такое поведение проверяют установкой пакета в чистое окружение, где рабочий каталог не маскирует ошибки импорта.

:::note[Ссылки для изучения]

1. [Namespace packages без `__init__.py` и объединение частей пакета — русская документация Python](https://pythondoc.ru/docs/python/3.10/reference/import/#namespace-packages)
   :::

---

## Как собрать и проверить Python-пакет? [#q-transfer-0242]

Метаданные и backend сборки задают в `pyproject.toml`; `src`-layout помогает не импортировать исходники случайно. Строят wheel и sdist стандартным frontend, затем устанавливают именно артефакт в чистое окружение. Проверяют импорт, консольные entry points, включение ресурсов, зависимости и тесты установленного пакета. Успешный запуск из корня репозитория сам по себе не доказывает, что wheel собран полно. Такое поведение проверяют установкой пакета в чистое окружение, где рабочий каталог не маскирует ошибки импорта.

:::note[Ссылки для изучения]

1. [Сборка wheel и sdist и проверка упаковки Python-проекта — Джеймс Беннетт](https://habr.com/ru/companies/otus/articles/713992/)
   :::
