Многоуровневый относительный импорт

Многоуровневый относительный импорт

У меня есть следующая структура папок

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

Как сделать такой относительный импорт мультипотока?

Ответы

Ответ 1

Вы должны импортировать foobar из родительской папки top:

import top.foo.bar.foobar

Это говорит Python, что top - это пакет верхнего уровня. Относительный импорт возможен только внутри пакета.

Ответ 2

Я понимаю, что это старый вопрос, но я чувствую, что принятый ответ, скорее всего, пропускает главную проблему с кодом опроса. Это не неправильно, строго говоря, но это дает предположение, что только совпадение происходит вокруг реальной проблемы.

Настоящая проблема заключается в том, что файл foobar.py в top\foo\bar запускается как script. При попытке относительного импорта (правильного!) Это терпит неудачу, потому что интерпретатор Python не понимает структуру пакета.

Лучшее решение для этого - запустить foobar.py не по имени файла, а вместо этого использовать флаг -m для интерпретатора, чтобы сообщить ему о запуске модуля top.foo.bar.foobar. Таким образом, Python будет знать основной модуль, который он загружает в пакет, и он точно знает, где ссылается относительный импорт.