Относительный импорт внутри проекта приводит к тому, что "SystemError: Родительский модуль" не загружен, не может выполнить относительный импорт "
Я работаю над проектом, который имеет следующую структуру:
project
├── config.py
└── modules
└── a.py
Согласно PEP 328 возможен относительный импорт. Однако, когда я запускаю Python (в оболочке) в том же каталоге, что и a.py
и выполните следующие команды:
from ..config import *
from ...project import *
Я получаю следующую ошибку:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
SystemError: Parent module '' not loaded, cannot perform relative import
Я это понимаю import *
не рекомендуется, он используется только для тестирования (пытается импортировать конфигурацию).
2 ответа
Относительный импорт может работать только там, где сам модуль был импортирован. Выполнение этой команды в интерактивном сеансе не имеет родительского модуля. Кроме того, текущий каталог является неявным поиском (таким образом, рассматривается как пакет) и так import a
от интерактивного переводчика в этом каталоге не будет родительского модуля.
Итак, для проверки установите PYTHONPATH в корень вашего проекта (как временную меру), затем выполните from modules import a
из другого каталога, например вашего домашнего каталога. a
Модуль может затем сделать from ..config import *
и только потом.
Вы можете преодолеть эту ошибку следующим образом:
- создать __init__.py в каталоге проекта и модулей
- запустите python -m project.modules.a в родительском каталоге проекта
См. ImportError: попытка относительного импорта без известного родительского пакета для получения дополнительной информации.