Одной из распространенных проблем, с которой сталкиваются новички при работе с Python, является понимание механизма относительных импортов. Проблема возникает при попытке импортировать функцию из другого файла, который находится в той же директории.
Вот типичный пример такой ситуации. Имеются два файла: my_module.py
, в котором определена функция my_function
, и main.py
, где эта функция необходима. Программист пытается импортировать функцию в main.py
одним из следующих способов:
from .my_module import my_function
или
from my_module import my_function
Однако один из этих способов не работает и вызывает одну из следующих ошибок:
ImportError: attempted relative import with no known parent package
ModuleNotFoundError: No module named 'my_module'
SystemError: Parent module '' not loaded, cannot perform relative import
В чем же причина такого поведения?
Причина кроется в особенностях относительных импортов в Python. Относительные импорты работают только тогда, когда модуль является частью пакета. Пакет в Python — это каталог, содержащий файлы .py
и специальный файл __init__.py
, который может быть пустым, но должен присутствовать в каталоге.
Относительный импорт начинается с точки (.
), которая обозначает текущий каталог, и затем следует имя модуля. Если модуль не является частью пакета или скрипт запускается как основной файл, то относительный импорт не будет работать, что вызывает ошибку ImportError
.
Если же импорт выполняется просто по имени модуля, без точки, Python пытается найти модуль сначала в текущем каталоге, затем в каталогах, указанных в переменной окружения PYTHONPATH
, и наконец в стандартных каталогах библиотеки Python. Если Python не может найти модуль, он выдает ошибку ModuleNotFoundError
.
Таким образом, для корректной работы относительных импортов необходимо следить за организацией файлов и каталогов в проекте и убедиться, что все модули, с которыми предполагается работать, являются частью одного пакета.
Добавить комментарий