Относительный импорт внутри проекта приводит к тому, что "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 *и только потом.

Вы можете преодолеть эту ошибку следующим образом:

  1. создать __init__.py в каталоге проекта и модулей
  2. запустите python -m project.modules.a в родительском каталоге проекта

См. ImportError: попытка относительного импорта без известного родительского пакета для получения дополнительной информации.

Другие вопросы по тегам