Когда в Python происходит импорт модуля, интерпретатор ищет его в директориях, перечисленных в sys.path. Сначала ищет среди стандартных модулей, потом среди файлов .py, .pyc и каталогов с файлом __init__.py (пакеты).
sys.modules.ModuleNotFoundError..pyc) и кэшируется (если есть права на запись).# mypkg/__init__.py (может быть пустым) # mypkg/mod.py # main.py import mypkg.mod
__init__.py (для Python <3.3 обязательно) — всё имеет значение.sys.path (первым всегда идёт директория текущего скрипта).from . import ..., абсолютный/относительный импорт).Что произойдёт, если в каталоге с вашим скриптом лежит файл с именем
random.pyи вы попытаетесь импортировать стандартный модульrandom?
Импортируется МОЙ локальный файл random.py, а не стандартная библиотека. Частая причина трудновыявляемых багов — коллизия имён модулей с библиотечными (shadowing). Следует внимательно относиться к именованию файлов.
История
В большом проекте модуль email.py случайно затмил стандартный модуль email из библиотеки, и разработчики долго не могли понять, почему не работают функции парсинга почты из сторонних библиотек.
История
В ML-проекте функция os.path не работала: рядом с основным скриптом был файл os.py, который перехватывал все обращения к стандартному модулю. Месяц тратили на отладку, пока не нашли конфликт имён.
История
В микросервисном REST API возникли циклические импорты при попытке сделать относительный импорт моделей между несколькими подпакетами. Решили проблему только после рефакторинга структуры проекта и явного порядка загрузки модулей.