Импорт модуля во вложенные пакеты

Это вопрос с новичком в python:

У меня есть следующая структура каталогов:

test
 -- test_file.py
a
 -- b
   -- module.py    

где test, a и b - папки. Оба test и a находятся на одном уровне.

module.py имеет класс под названием shape, и я хочу создать экземпляр экземпляра в test_file.py. Как я могу это сделать?

Я пробовал:

from a.b import module

но я получил:

ImportError: No module named a.b

Ответы

Ответ 1

Что вы хотите, так это относительный импорт:

from ..a.b import module

Проблема заключается в том, что он не работает, если вы вызываете test_file.py в качестве основного модуля. Как указано здесь:

Обратите внимание, что как явный, так и неявный относительный импорт основаны на имени текущего модуля. Поскольку имя основного модуля всегда " main", модули, предназначенные для использования в качестве основного модуля приложения Python, должны всегда использовать абсолютный импорт.

Итак, если вы хотите называть test_file.py в качестве основного модуля, вам следует рассмотреть возможность изменения структуры ваших модулей и использования абсолютного импорта, иначе просто используйте относительный импорт сверху.

Ответ 2

  • Каталог a должен быть пакетом. Добавьте файл __init__.py, чтобы сделать его пакетом, который является шагом от простого каталога.

  • Каталог b также должен быть подпакетом a. Добавьте файл __init__.py.

  • Каталог test должен также быть пакетом. Трудно сказать, нужно ли это или нет. Как правило, хорошей идеей для каждого каталога модулей Python является формальный пакет.

  • Для import пакет должен быть на sys.path; это построено из переменной среды PYTHONPATH. По умолчанию установленные пакеты сайтов и текущий рабочий каталог (фактически) - это только два места, где можно найти пакет.

    Это означает, что a должен быть установлен или ваш текущий рабочий каталог также должен быть пакетом на один уровень выше a.

    ИЛИ, вы должны установить переменную среды PYTHONPATH, чтобы включить a.

http://docs.python.org/tutorial/modules.html#the-module-search-path

http://docs.python.org/using/cmdline.html#envvar-PYTHONPATH

Кроме того, http://docs.python.org/library/site.html для получения полной информации о том, как sys.path построен.

Ответ 3

Первое, что нужно сделать, - быстро просмотреть официальные документы в этом.

Чтобы сделать каталог пакетом, вам нужно добавить файл __init__.py. Это означает, что у вас будет такой файл в каталогах a и b. Затем вы можете напрямую выполнить

import a.b.module

Но вам придется ссылаться на него как a.b.module, который является утомительным, поэтому вы можете использовать форму as для импорта так:

import a.b.module as mod #shorter name

и ссылайтесь на него как mod.

Затем вы можете создавать экземпляры внутри mod, используя обычные соглашения, такие как mod.shape().

Есть несколько других тонкостей. Пожалуйста, ознакомьтесь с документами.