Python - абсолютный импорт из подпапки

В основном я задаю тот же вопрос, что и этот парень: Как сделать относительный импорт в Python?

Но никто не дал ему правильного ответа. Учитывая, что вы находитесь в подпапке, и вы хотите перейти в каталог, а затем в другую папку вложенных файлов, то выполнение того, что они предлагают, не работает (как указывал OP в своих комментариях к их ответам).

Я знаю, что вы можете сделать это, используя sys.path, но я бы предпочел более чистый метод.

Пример:

App
__init__.py
Package_A
--__init__.py
--Module_A.py
Package_B
--__init__.py
--Module_B.py

Как мне импортировать Module_A в Module_B?

Ответ 1

main.py
setup.py
app/ ->
    __init__.py
    package_a/ ->
       __init__.py
       module_a.py
    package_b/ ->
       __init__.py
       module_b.py
  • Вы запускаете python main.py.
  • main.py делает: import app.package_a.module_a
  • module_a.py делает import app.package_b.module_b

Альтернативно 2 или 3 могут использовать: from app.package_a import module_a

Это будет работать до тех пор, пока у вас есть app в вашем PYTHONPATH. main.py может быть где угодно.

Итак, вы пишете setup.py, чтобы скопировать (установить) весь пакет приложений и подпакеты в целевые папки python системы и main.py в целевые папки script.

Ответ 2

Если я читает правильно, в Python 2.5 или выше:

from ..Module_B import Module_B

Я думал, что хорошо разбираюсь в Python, но я понятия не имел, что это возможно в версии 2.5.

Ответ 3

Если вы затем импортируете Module_B в приложение, вы бы

Module_B.py:   import ModuleA

App.py(который также импортирует ModuleA, который по умолчанию используется в вашем Pythonpath)

import Module_B.Module_B

Другой альтернативой является обновление __init__.py(в папке Module_A/App) до:

import os
import sys
sys.path.extend('%s../' % os.getcwd())
import ModuleA

Другой альтернативой является добавление вашей папки в среду PYTHONPATH var.