По сути, я задаю тот же вопрос, что и этот парень: Как сделать относительный импорт в 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?






Если я чтениеправильно, в Python 2.5 или выше:
from ..Module_B import Module_B
Я думал, что хорошо разбираюсь в Python, но понятия не имел, что это возможно в версии 2.5.
Это правильно. Хотя это немного некрасиво, и абсолютный импорт, как правило, лучше всего, за исключением особых обстоятельств.
ЭТО не работает. Я получаю «попытка относительного импорта в пакете, отличном от пакета».
Предполагается, что оператор находится внутри Module_A.py (и после редактирования должен быть из ..Package_B.) Относительный импорт основан на пути пакета модуля, внутри которого вы находитесь, а не на каталогах; вы не можете использовать их из сценария верхнего уровня или простого модуля.
Если вы затем импортируете Module_B в приложение, вы должны
Module_B.py: импорт ModuleA
App.py (который также импортирует ModuleA, который теперь по умолчанию находится в вашем пути Python)
import Module_B.Module_B
Другой вариант - обновить __init__.py (тот, что находится в папке Module_A / App) до:
import os
import sys
sys.path.extend('%s../' % os.getcwd())
import ModuleA
Другой вариант - добавить вашу папку в окружение PYTHONPATH var.
Модификация sys.path во время выполнения почти всегда ошибочна. Он хрупкий и указывает на плохо структурированную упаковку.
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_amodule_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 в папки сценариев целевой системы.
Главное - добавить соответствующие файлы __init__.py в каждый каталог и включить app в ваш оператор импорта. Если вы это сделаете, добавление строки import app.package_a.module_a в module_b.py должно выполнить соответствующий импорт. По сути, шаг 3 - это то, что вам нужно, остальное не имеет значения, если вы не планируете распространять пакет.
Под "Module_A" вы подразумеваете "Package_A"? Пакет содержит «в этом.py и, возможно, дополнительные модули. Можете ли вы переписать ваши« Module_A »и« Module_B »на« Package_A »и« Package_B », чтобы ваш вопрос был более ясным?