2016-08-10 2 views
0

У меня проблема при использовании импорта python. Я написал готовый модуль, который сам использует несколько подмодулей (они импортированы).Python импортирует подмодули из подмодуля

например.

module: 
    main_class.py 
    submodule1.py 
    .... 

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

supermodule: 
    main_class_super.py  -- this class imports module.main_class 
    module: 
     main_class.py 
     submodule1.py 
     .... 

Однако теперь весь импорт, которые используются в коде main_class.py внутри модуль не в состоянии (Я думаю, потому что импорт теперь работает в пространстве имен main_class_super.py)

Любая идея, как решить эту проблему без перестройки всех источников?


Конкретная ошибка:

В моих main_class.py я использую строку:

import submodule1 

В моем supermodule.py я использую строку:

import module.main_class 

При выполнении суперкласса импорт module.main_class, конечно, import submodule1 также выполняется, но не удается, так как он не может найти модуль в пространстве имен supermodule.py.

ответ

1

Если вы на Python 2, вы должны добавить from __future__ import absolute_import к файлам (не требуется на 3), так что вы можете сделать импорт, как Guido states in PEP 328

В соответствии с этим вы должны

  • Убедитесь, что все ваши папки пакета имеют __init__.py в нем, чтобы отметить их как

  • импортируемых
  • в main_class.py: заменить import submodule1 или import module.submodule1 с from . import submodule1

  • В main_class_super.py: заменить import module.main_class с from .module import main_class

Таким образом, вы не должны заботиться о какой-либо внешней структуры пакета.

Возможность использования абсолютного и явного относительного импорта was added в Python 2.5.

+0

Er, я думаю, я не совсем понимаю, как это может мне помочь. Учитывая мою структуру папок, как мне сделать импорт subodule1.py внутри файла supermodule.py? – WodkaRHR

+0

отредактировал ответ, чтобы добавить явное решение – janbrohl

+0

Извините, что беспокою вас снова, я столкнулся с другой проблемой. Внутри этих подмодулей несколько модулей импортируют одни и те же другие модули (например, subodule1 импортирует подмодуль2 и 3, а подмодуль2 также импортирует подмодуль 3. Затем этот импорт внутри субмодуля2 не работает (хотя я изменил его на. Import submodule3). – WodkaRHR

Смежные вопросы