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

Это - вопрос о новичке 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
26
задан Glenn Maynard 2 February 2010 в 12:05
поделиться

3 ответа

Вам нужен относительный импорт, например:

из модуля импорта ..ab

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

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

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

22
ответ дан 28 November 2019 в 07:16
поделиться
  1. Каталог A должен быть пакетом Отказ Добавьте __ __ init __. PY файл, чтобы сделать его пакетом, который является шагом вверх из простого каталога.

  2. Справочник B также должен быть подпакасим A . Добавьте __ init __. Py файл.

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

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

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

    Или, необходимо установить вашу вариабельную среду Pythonpath , чтобы включить A .

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

http://docs.cython.org/using/cmdline.html#envvar-pythonpath

Также http://docssython.org/library/site.html Для полной информации о том, как Sys.Path построен.

13
ответ дан 28 November 2019 в 07:16
поделиться

См. SD CLONDER , инструмент для обнаружения кода копирования-файла-редактирования в нескольких файлах. Он обнаруживает точные копии, копии, которые были переформатированы, а близко-мисс-копии с разными идентификаторами, литералами и даже разными Seqeunces of thowurent.

ClonceR обрабатывает много языков, включая Java (1,4,1,5,1,6) и C #, особенно до C # 4.0. Вы можете увидеть отчеты об обнаружении образца клона на веб-сайте, также включая один для C #.

-121--3176619-

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

Чтобы сделать каталог пакет, вы должны добавить __ init __. Py файл. Это означает, что у вас будет такой файл в A и B каталогов. Тогда вы можете напрямую сделать

import a.b.module

, но вам придется обратиться к нему как ABModule , который утомительно, чтобы вы могли использовать форму как , как в формате импорта

import a.b.module as mod #shorter name

и обратитесь к нему по моду .

Тогда вы можете создать создание вещей внутри MOD , используя обычные конвенции, такие как Mod.Shape () .

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

10
ответ дан 28 November 2019 в 07:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: