Относительные модули импорта из подпапки родительских папок

Учитывая такую структуру каталогов

/main/
/main/common/foo.py
/main/A/
/main/A/src/
/main/A/src/bar.py

Как я могу использовать относительный импорт Python для импорта foo из bar? У меня есть рабочее решение, добавив его на путь, но это уродливо. Есть ли способ просто сделать с одним import в Python 2.7?

Это более сложная версия этого вопроса:

Импорт модулей из родительской папки

Ответ 1

Правильный относительный импорт будет следующим:

from ...common import foo

Однако относительный импорт предназначен только для работы в рамках одного пакета. Если main - это пакет, то здесь вы можете использовать относительный импорт. Если main не является пакетом, вы не можете.

Таким образом, если вы запускаете скрипт в /main/ и делаете что-то вроде import A.src.bar, то этот относительный импорт не будет работать с "Попытка относительного импорта за пределы пакета верхнего уровня". Это связано с тем, что относительный импорт пытается импортировать что-то за пределы пакета A верхнего уровня.

Однако, если вы запускаете скрипт в / и делаете что-то вроде import main.A.src.bar, то этот относительный импорт будет успешным, потому что main теперь является пакетом. В этом случае следующие два будут эквивалентными:

from ...common import foo
from main.common import foo

Чтобы ответить на ваш комментарий: значение . не изменяется в зависимости от того, где был запущен скрипт, он изменяется в зависимости от структуры пакета.