Модуль Intrapackage загружается в Python - PullRequest
2 голосов
/ 16 февраля 2012

Я только начинаю с python и у меня проблемы с пониманием пути поиска загрузок внутри пакета. У меня есть такая структура:

top/                        Top-level package
    __init__.py             Initialize the top package
    src/                    Subpackage for source files
      __init__.py
      pkg1/           Source subpackage 1
         __init__.py          
         mod1_1.py
         mod1_2.py
        ...
      pkg2/           Source subpackage 2
         __init__.py
         mod2_1.py
         mod2_2.py          
         ...
       ...
    test/                  Subpackage for unit testing
      __init__.py
      pkg1Test/      Tests for subpackage1
         __init__.py
         testSuite1_1.py
         testSuite1_2.py
         ...
      pkg2Test/      Tests for subpackage2
        __init__.py
        testSuite2_1.py
        testSuite2_2.py
        ...
    ... 

В testSuite1_1 мне нужно импортировать модуль mod1_1.py (и так далее). Какой оператор импорта я должен использовать? Официальный учебник Python (на docs.python.org, раздел 6.4.2) гласит:

"Если импортированный модуль не найден в текущем пакете (пакет, для которого текущий модуль является подмодулем), оператор import ищет модуль верхнего уровня с заданным именем."

Я понял, что могу использовать (изнутри testSuite1_1.py):

из src.pkg1 import mod1_1

или

import src.pkg1.mod1_1

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

Редактировать: я изменил имена модулей в соответствии с соглашениями об именах Python. Но я все еще не могу заставить этот простой пример работать.

Ответы [ 2 ]

2 голосов
/ 16 февраля 2012

Имя модуля не включает расширение .py.Кроме того, в вашем примере модуль верхнего уровня на самом деле называется top.И, наконец, дефисы недопустимы для имен в python, я бы предложил заменить их на подчеркивания.Тогда попробуйте:

from top.src.pkg1 import mod1_1
0 голосов
/ 17 февраля 2012

Проблема решена с помощью http://legacy.python.org/doc/essays/packages.html (упоминается в аналогичном вопросе).Ключевой момент (perhpas очевиден для более опытных разработчиков Python) заключается в следующем:

"Чтобы программа Python могла использовать пакет, пакет должен быть найден с помощью оператора import. Другими словами, пакет долженбыть подкаталогом каталога, который находится на sys.path. [...] самый простой способ убедиться, что пакет был на sys.path, это либо установить его в стандартной библиотеке, либо заставить пользователей расширить sys.path, установивих переменная среды оболочки $ PYTHONPATH "

Добавление пути" top "к PYTHONPATH решило проблему. Чтобы сделать решение переносимым (это личный проект, но мне нужно поделиться им на нескольких машинах), ядумаю, что минимальный код инициализации в top / setup.py должен работать.

...