Python - Выполнение абсолютного импорта из подпапки - PullRequest
12 голосов
/ 21 января 2009

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

Но никто не дал ему правильного ответа. Если вы находитесь в подпапке и хотите перейти в каталог, а затем в ДРУГУЮ подпапку, то, что они предложили, не работает (как указывал ФП в своих комментариях к ответам).

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

Пример:

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

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

Ответы [ 3 ]

11 голосов
/ 21 января 2009
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 в целевые папки сценариев системы.

2 голосов
/ 21 января 2009

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

from ..Module_B import Module_B

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

0 голосов
/ 21 января 2009

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

Module_B.py: модуль импорта A

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.

...