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?

Под "Module_A" вы подразумеваете "Package_A"? Пакет содержит «в этом.py и, возможно, дополнительные модули. Можете ли вы переписать ваши« Module_A »и« Module_B »на« Package_A »и« Package_B », чтобы ваш вопрос был более ясным?

S.Lott 21.01.2009 03:28
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
12
1
8 128
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

from ..Module_B import Module_B

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

Это правильно. Хотя это немного некрасиво, и абсолютный импорт, как правило, лучше всего, за исключением особых обстоятельств.

bobince 21.01.2009 03:38

ЭТО не работает. Я получаю «попытка относительного импорта в пакете, отличном от пакета».

ryeguy 21.01.2009 04:01

Предполагается, что оператор находится внутри Module_A.py (и после редактирования должен быть из ..Package_B.) Относительный импорт основан на пути пакета модуля, внутри которого вы находитесь, а не на каталогах; вы не можете использовать их из сценария верхнего уровня или простого модуля.

bobince 21.01.2009 05:20

Если вы затем импортируете 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 во время выполнения почти всегда ошибочна. Он хрупкий и указывает на плохо структурированную упаковку.

habnabit 03.01.2010 17:12
Ответ принят как подходящий
main.py
setup.py
app/ ->
    __init__.py
    package_a/ ->
       __init__.py
       module_a.py
    package_b/ ->
       __init__.py
       module_b.py
  1. Вы запускаете python main.py.
  2. main.py делает: import app.package_a.module_a
  3. 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 в папки сценариев целевой системы.

Главное - добавить соответствующие файлы __init__.py в каждый каталог и включить app в ваш оператор импорта. Если вы это сделаете, добавление строки import app.package_a.module_a в module_b.py должно выполнить соответствующий импорт. По сути, шаг 3 - это то, что вам нужно, остальное не имеет значения, если вы не планируете распространять пакет.

Nick Crawford 24.10.2011 18:52

Другие вопросы по теме