Проблема заключается в том, что при запуске из каталога по умолчанию только пакеты, являющиеся подкаталогами, отображаются в качестве кандидатов на импорт, поэтому вы не можете импортировать a.b.d. Однако вы можете импортировать b.d. так как b является подпакетом a.
Если вы действительно хотите импортировать a.b.d в c/__init__.py
, это можно сделать, изменив системный путь на один каталог выше a и изменив импорт в a/__init__.py
на импорт a.b.c.
Ваш a/__init__.py
должен выглядеть так:
import sys
import os
# set sytem path to be directory above so that a can be a
# package namespace
DIRECTORY_SCRIPT = os.path.dirname(os.path.realpath(__file__))
sys.path.insert(0,DIRECTORY_SCRIPT+"/..")
import a.b.c
Дополнительная трудность возникает, когда вы хотите запускать модули в c как скрипты. Здесь пакеты a и b не существуют. Вы можете взломать __int__.py
в каталоге c, чтобы указать sys.path на каталог верхнего уровня, а затем импортировать __init__
во все модули внутри c, чтобы иметь возможность использовать полный путь для импорта a.b.d. Я сомневаюсь, что это хорошая практика для импорта __init__.py
, но это сработало для моих случаев использования.