Ответ 1
Вы должны импортировать foobar
из родительской папки top
:
import top.foo.bar.foobar
Это говорит Python, что top
- это пакет верхнего уровня. Относительный импорт возможен только внутри пакета.
Многоуровневый относительный импорт
У меня есть следующая структура папок
top\
__init__.py
util\
__init__.py
utiltest.py
foo\
__init__.py
foo.py
bar\
__init__.py
foobar.py
Я хочу получить доступ с foobar.py
к модулю utiltest.py
. Я попробовал относительный импорт, но это не работает:
from ...util.utiltest import *
Я всегда получаю
ValueError: Attempted relative import beyond toplevel package
Как сделать такой относительный импорт мультипотока?
Вы должны импортировать foobar
из родительской папки top
:
import top.foo.bar.foobar
Это говорит Python, что top
- это пакет верхнего уровня. Относительный импорт возможен только внутри пакета.
Я понимаю, что это старый вопрос, но я чувствую, что принятый ответ, скорее всего, пропускает главную проблему с кодом опроса. Это не неправильно, строго говоря, но это дает предположение, что только совпадение происходит вокруг реальной проблемы.
Настоящая проблема заключается в том, что файл foobar.py
в top\foo\bar
запускается как script. При попытке относительного импорта (правильного!) Это терпит неудачу, потому что интерпретатор Python не понимает структуру пакета.
Лучшее решение для этого - запустить foobar.py
не по имени файла, а вместо этого использовать флаг -m
для интерпретатора, чтобы сообщить ему о запуске модуля top.foo.bar.foobar
. Таким образом, Python будет знать основной модуль, который он загружает в пакет, и он точно знает, где ссылается относительный импорт.