импорт модуля во вложенных пакетах - PullRequest
22 голосов
/ 02 февраля 2010

Это вопрос новичка на питоне:

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

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

Ответы [ 3 ]

18 голосов
/ 02 февраля 2010

Требуется относительный импорт, например:

from ..a.b import module

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

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

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

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

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

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

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

    Это означает, что 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 построен.

10 голосов
/ 02 февраля 2010

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

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

import a.b.module

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

import a.b.module as mod #shorter name

и именуйте его mod.

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

Есть еще несколько тонкостей. Пожалуйста, просмотрите документы для деталей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...