2016-07-15 2 views
3

Я работаю над проектом, который имеет следующую структуру:Относительный импорт внутри результатов проекта в «SystemError: модуль Parent„“не загружен, не может выполнить относительный импорт»

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 

I что import * не рекомендуется, он используется только для тестирования (попытка импортировать конфигурацию).

+0

Какая строка вызывает ошибку? – martineau

+0

Команды - это строка. Я получаю ошибку, когда я запускаю либо 'from ..config import *', либо 'from ... project import *'. – Greg

+1

Я думаю, вам нужен (пустой) '__init __. Py' файл в каталоге' project'. – martineau

ответ

4

Относительный импорт может работать только там, где сам модуль был импортирован. Запуск этой команды в интерактивном сеансе не имеет родительского модуля. Кроме того, текущий каталог неявно выполняет поиск (таким образом, обрабатывается как пакет), поэтому import a из интерактивного интерпретатора в этом каталоге не будет иметь родительского модуля.

Итак, чтобы проверить, установите PYTHONPATH в корневой каталог вашего проекта (как временную меру). Затем выполните from modules import a из другого каталога, например, вашего домашнего каталога. Модуль a может затем выполнить команду from ..config import * и только после этого.

-1

Вы можете преодолеть эту ошибку:

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

Для получения более подробной информации см. ImportError: attempted relative import with no known parent package.

+0

Означает ли это, что 'if __name__ == '__main __':' необходимо? Должно ли это быть в config.py, a.py или обоих? Я не уверен, что означает этот параграф. – Greg

Смежные вопросы