Это похоже на то, что вы пытаетесь сделать, будет намного лучше обслуживаться глобальным поиском и заменой.
Вы импортируете из пакета «sub». start.py
не входит в пакет, даже если присутствует __init__.py
.
Вам нужно будет запустить свою программу из одного каталога через parent.py
:
./start.py
./pkg/__init__.py
./pkg/parent.py
./pkg/sub/__init__.py
./pkg/sub/relative.py
С start.py
:
import pkg.sub.relative
Теперь pkg - это пакет верхнего уровня, и ваш относительный импорт должен работать.
Если вы хотите придерживаться своего текущего макета, может просто использовать import parent
. Поскольку вы используете start.py
для запуска вашего интерпретатора, каталог, в котором находится start.py
, находится в вашем пути python. parent.py
живет там как отдельный модуль.
Вы также можете безопасно удалить верхний уровень __init__.py
, если вы ничего не импортируете в скрипт дальше по дереву каталогов.
Если вы назовете relative.py
напрямую, и если вы действительно хотите импортировать из модуля верхнего уровня, вы должны явно добавить его в список sys.path
. Вот как это должно работать:
# Add this line to the beginning of relative.py file
import sys
sys.path.append('..')
# Now you can do imports from one directory top cause it is in the sys.path
import parent
# And even like this:
from parent import Parent
Если вы считаете, что приведенное выше может вызвать какую-то несогласованность, вы можете использовать это вместо:
sys.path.append(sys.path[0] + "/..")
sys.path[0]
относится к путь, по которому проходила точка входа.