Многоуровневый относительный импорт - PullRequest
18 голосов
/ 14 февраля 2012

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

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

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

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

Ответы [ 2 ]

13 голосов
/ 16 сентября 2015

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

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

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

12 голосов
/ 14 февраля 2012

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

import top.foo.bar.foobar

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

...