Ответ 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
Чтобы ответить на ваш комментарий: значение .
не изменяется в зависимости от того, где был запущен скрипт, он изменяется в зависимости от структуры пакета.