цепной импорт из подкаталога в python

Я использую чужой проект, чтобы добавить некоторые функции в свой, и есть скрипт Python, который я хочу импортировать. Проблема связана со структурой импорта их каталогов: я поместил каталог их проекта в подпапку в моем основном проекте (должен оставаться там, чтобы я мог держать их проект вне контроля версий), это выглядит так:

myproject/
  myscript.py
  theirproject/
    __init__.py
    baz.py
    secondlayer/
      __init__.py
      all.py
      foo.py
      bar.py

all.py — это просто список операторов импорта, которые импортируют дополнительные скрипты из каталога secondlayer, например:

from secondlayer.foo import *
from secondlayer.bar import * #etc

Я хотел бы импортировать:

from theirproject.secondlayer.all import *

но это не удается, когда python жалуется на «нет модуля с именем secondlayer.foo». Я также пробовал следующее:

from theirproject.secondlayer import all

Я могу заставить его работать, когда помещаю свой скрипт в их проект/ и импортирую все без префикса «их проект», но я действительно не могу этого сделать. Я могу продолжить процесс импорта, импортируя foo, bar и т. д. по отдельности, например так:

from theirproject.secondlayer import foo
from theirproject.secondlayer import bar #etc

Но затем эти скрипты не могут импортировать больше материала из других скриптов (например, baz.py) на том же уровне, что и второй слой, поэтому я застрял.

Как правильно это сделать в python 2.7.6?


person domoarigato    schedule 17.08.2014    source источник


Ответы (3)


Если вы измените

from secondlayer.foo import *
from secondlayer.bar import *

для пользовательского относительного импорта, подобного этому

from .foo import *
from .bar import *

или вот так

from foo import *
from bar import *

оно работает.

Кроме того, вы можете сделать этот импорт в __init__.py на уровне второго уровня, чтобы импорт из myscript.py стал

from theirproject.secondlayer.all import *
person junnytony    schedule 17.08.2014

Посмотрите, есть ли у вас необходимые разрешения для импорта пакета из вашего каталога и его соответствующих подкаталогов.

Для справки вы можете увидеть это и соответствующие связанные вопросы:

Импорт Python не работает

person Varun    schedule 18.08.2014

В итоге я решил свою проблему, добавив их проект/ в мой PYTHONPATH. Я проголосовал за ответ junnytony - это помогло указать мне правильное направление, так что спасибо!

person domoarigato    schedule 20.08.2014