Импорт модуля во вложенные пакеты
Это вопрос с новичком в 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()
.
Есть несколько других тонкостей. Пожалуйста, ознакомьтесь с документами.