Я не могу на всю жизнь заставить относительный импорт Python работать. Я создал простой пример, где он не работает:
Структура каталогов:
/__init__.py
/start.py
/parent.py
/sub/__init__.py
/sub/relative.py
/start.py
содержит только: import sub.relative
/sub/relative.py
содержит только from .. import parent
Все остальные файлы пустые.
При выполнении следующего в командной строке:
$ cd /
$ python start.py
Я получил:
Traceback (most recent call last):
File "start.py", line 1, in <module>
import sub.relative
File "/home/cvondrick/sandbox/sub/relative.py", line 1, in <module>
from .. import parent
ValueError: Attempted relative import beyond toplevel package
Я использую Python 2.6. Почему это так? Как мне заставить этот пример с песочницей работать?
Если вы собираетесь позвонить
relative.py
напрямую и, например, если вы действительно хотите импортировать из модуля верхнего уровня, вы должны явно добавить его вsys.path
список.Вот как это должно работать:
Если вы думаете, что вышеизложенное может вызвать некоторую несогласованность, вы можете использовать это вместо:
sys.path[0]
относится к пути, с которого была запущена точка входа.источник
Проверяем это в python3:
Example1:
Если мы запустим это так (просто чтобы убедиться, что PYTHONPATH пуст):
Вывод:
Если мы изменим импорт в
sub/relative.py
Если мы запустим это так:
Вывод:
Example2:
Запустите это как:
Вывод:
Если мы изменим импорт в
sub/start.py
:Запустите это как:
Вывод:
Запустите это как:
Вывод:
Также лучше использовать импорт из корневой папки, то есть:
Запустите это как:
Вывод:
источник