<MyRusakov.ru />

Создание игр на Unreal Engine 5

Создание игр на Unreal Engine 5

Данный курс научит Вас созданию игр на Unreal Engine 5. Курс состоит из 12 модулей, в которых Вы с нуля освоите этот движок и сможете создавать самые разные игры.

В курсе Вы получите всю необходимую теоретическую часть, а также увидите массу практических примеров. Дополнительно, почти к каждому уроку идут упражнения для закрепления материала.

Помимо самого курса Вас ждёт ещё 8 бесплатных ценных Бонусов: «Chaos Destruction», «Разработка 2D-игры», «Динамическая смена дня и ночи», «Создание динамической погоды», «Создание искусственного интеллекта для NPC», «Создание игры под мобильные устройства», «Создание прототипа RPG с открытым миром» и и весь курс «Создание игр на Unreal Engine 4» (актуальный и в 5-й версии), включающий в себя ещё десятки часов видеоуроков.

Подробнее
Подписка

Подпишитесь на мой канал на YouTube, где я регулярно публикую новые видео.

YouTube Подписаться

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Какая тема Вас интересует больше?

Импорт модулей и пакетов в Python: понятное руководство с примерами

Импорт модулей и пакетов в Python: понятное руководство с примерами

Поисковый запрос: «Импорт модулей в Python» — частый гость у начинающих. Ниже вы найдёте пошаговое объяснение, как работает механизм импорта, чем модуль отличается от пакета, как устроен поиск по sys.path, что такое абсолютные и относительные импорты, и как организовать проект, чтобы не ловить ModuleNotFoundError.

Модуль и пакет: в чём разница

Модуль — это обычный .py-файл. Пакет — это папка с файлами Python, которую интерпретатор воспринимает как единое пространство имён. В современных версиях Python пакет может быть:

  • Стандартным: папка с __init__.py
  • Namespace-пакетом: папка без __init__.py (удобно для распределённых пакетов)

Как работает import в Python

  • При первом импорте модуль выполняется целиком (верхнеуровневый код).
  • Загруженный модуль кэшируется в sys.modules — повторный импорт быстрый и не выполняет модуль заново.
  • Поиск модуля идёт по списку путей в sys.path (текущая папка, путь скрипта, установленные пакеты, стандартная библиотека и др.).
# demo_module.py
print("Верхнеуровневый код исполнился при импорте")
VALUE = 42

# main.py
import demo_module
print(demo_module.VALUE)

Запуск python main.py выведет сообщение из demo_module один раз, даже если вы импортируете его в нескольких местах.

Абсолютные и относительные импорты

Абсолютный импорт указывает путь от корня пакета: from app.utils import text. Относительный импорт опирается на текущее положение модуля и использует точки: from .utils import text или from ..common import constants.

# Структура проекта
app/
├─ __init__.py
├─ utils/
│  ├─ __init__.py
│  └─ text.py
└─ services/
   ├─ __init__.py
   └─ processor.py

# app/utils/text.py
def slugify(s: str) -> str:
    return s.lower().replace(" ", "-")

# app/services/processor.py
from ..utils.text import slugify   # относительный импорт

def process(title: str) -> str:
    return slugify(title).strip("-")

# main.py (на уровень выше app)
from app.services.processor import process  # абсолютный импорт
print(process(" Hello World "))

Совет: внутри пакета используйте относительные импорты для локальных зависимостей; для кода вне пакета — абсолютные. Это упрощает переносимость и чтение.

PYTHONPATH и sys.path: где Python ищет модули

Если при запуске вы получаете ModuleNotFoundError, скорее всего каталог проекта не в sys.path. Временное решение — добавить путь в переменную окружения PYTHONPATH или модифицировать sys.path в рантайме (на свой страх и риск).

# Временно для одной сессии Linux/macOS
export PYTHONPATH=$(pwd)
python main.py

# Временно для одной сессии Windows (PowerShell)
$env:PYTHONPATH=Get-Location
python main.py

# В коде (не рекомендуется как постоянная практика)
import sys, pathlib
sys.path.append(str(pathlib.Path(__file__).resolve().parent))

Правильнее — запускать скрипт из корня проекта или оформлять исполняемые точки входа через пакетный менеджер.

Роль __init__.py и __all__

__init__.py делает папку обычным пакетом и может выполнять код инициализации. Через __all__ можно контролировать экспорт при from package import * (звёздочный импорт лучше избегать, но знать полезно).

# app/utils/__init__.py
from .text import slugify
__all__ = ["slugify"]

# Теперь:
from app.utils import *
print(slugify("Hello Python"))

Типичные ошибки и как их исправить

  • ModuleNotFoundError: проверьте текущую рабочую директорию и структуру проекта; запускать лучше из корня.
  • Импорт как скрипт: если модуль запускают напрямую, относительные импорты могут падать. Используйте флаг -m.
# Правильно запускать пакетный модуль так:
python -m app.services.processor

# Внутри модуля защищайте исполняемый код:
if __name__ == "__main__":
    print(process("Run as module"))

Циклические импорты: как распознать и лечить

Цикл возникает, когда a.py импортирует b.py, а b.py — обратно a.py. Симптомы: атрибуты None, частично инициализированные модули, странные ошибки при импорте.

  • Перенесите импорт внутрь функции (ленивый импорт).
  • Вынесите общее в третий модуль.
  • Замените прямые импорты на локальные или отложенные.
# a.py
def use_b(x):
    from b import transform  # локальный импорт, избегает цикла на уровне модуля
    return transform(x)

# b.py
def transform(x):
    return x * 2

Импорт эффективно: практические советы

  • Импорт по псевдониму: import numpy as np — короче и принят в сообществе для больших библиотек.
  • Импорт только нужного: from pathlib import Path — ускоряет доступ и повышает читаемость.
  • Ленивые импорты: импорт внутри функции ускоряет старт приложения и избегает лишних зависимостей на горячем пути.
  • Избегайте звёздочки: from x import * ухудшает читаемость и может ломать автодополнение IDE.
  • Файлы с побочными эффектами: минимизируйте код верхнего уровня (логирование, сетевые вызовы) — он выполнится при каждом импорте впервые.

Рекомендуемая структура проекта

project/
├─ pyproject.toml
├─ README.md
├─ src/
│  └─ app/
│     ├─ __init__.py
│     ├─ utils/
│     │  ├─ __init__.py
│     │  └─ text.py
│     └─ services/
│        ├─ __init__.py
│        └─ processor.py
└─ tests/
   └─ test_processor.py

# Настраивайте IDE/тесты так, чтобы корень src попадал в sys.path,
# либо запускайте из корня:
python -m app.services.processor  # если cwd = src

Быстрый чек‑лист при ошибках импорта

  • Запускаете из корня проекта? Проверьте pwd и IDE Run Configuration.
  • Есть ли опечатки в имени модуля/пакета? Регистр важен в Unix-системах.
  • Не конфликтует ли имя файла с именем пакета стандартной библиотеки? (например, random.py)
  • Нет ли циклических импортов? Попробуйте отложенные импорты.
  • Нужен ли __init__.py? Для обычных пакетов — да.

Где прокачаться дальше

Хотите уверенно разбираться в структуре проектов, импортах и лучших практиках? Посмотрите программу курса — он ведёт от основ к продвинутым темам:

Пройти курс «Программирование на Python с Нуля до Гуру» и прокачать импорты на практике

Итоги

Импорт модулей в Python — не магия, а понятный механизм: модуль выполняется один раз, кэшируется в sys.modules, а поиск идёт по sys.path. Грамотная структура проекта, осознанный выбор между абсолютными и относительными импортами, минимизация побочных эффектов и внимательность к циклическим зависимостям избавят вас от большинства ошибок на ранних этапах разработки.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (https://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: https://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: https://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как создать свой сайт

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (0):

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.