2013-11-13 4 views
1

Я пишу небольшой пакет, и я пытаюсь включить в него демонстрационный скрипт. Тем не менее, я не могу явно импортировать пакет изнутри, как будто я был вне его.Как импортировать пакет из пакета?

С структуру каталогов, как:

trainer/ 
    __init__.py 
    helper.py 
    trainer.py 
    [...more files...] 
    demo.py 

В demo.py я не могу сделать from .. import trainer, как он жалуется на «Попытка относительно импорта в не-пакет», несмотря на __init__.py. Если я перемещаю демо вверх по каталогу и import trainer, он отлично работает, но я пытался сохранить его вместе с пакетом.

Взгляд import __init__ as trainer работает, но eeeew.

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

+0

если его в пакете все, что вам нужно сделать, это 'импорт trainer' – jramirez

+0

Разве это не эквивалент' импорта trainer.trainer в trainer' (из вне пакета)? Является ли название пакета и модуля тем же, что и меня, дерево? –

ответ

0

Способ организации файлов, demo.py становится частью пакета, который может быть или не быть тем, что вы хотите. Вы можете организовать свои файлы немного по-другому, двигаясь demo.py за пределами тренер каталог:

TopDir/ 
    demo.py 
    trainer/ 
    __init__.py 
    helper.py 
    trainer.py 
    [... more files ...] 

Затем demo.py может сделать что-то вроде:

from trainer import trainer, helper 
2

Если вы» Повторяя попытку запустить demo.py как python demo.py, проблема, с которой вы сталкиваетесь, скорее всего совпадает с here.

Что происходит, что механизм относительного импорта Python работает с использованием __name__ текущего модуля. Когда вы выполняете модуль напрямую, __name__ получает значение "__main__" независимо от имени фактического модуля. Таким образом, относительный (в упаковке) импорт не работает.

Чтобы исправить это, вы можете сделать следующее:

  • Выполнить demo.pyв качестве модуля в пакете, например, так: python -m trainer.demo. Это должно исправить ошибку, но вы по-прежнему будете импортировать модуль trainer.py вместо пакета.

  • Теперь добавьте from __future__ import absolute_import к demo.py, который заставит ваши импорт абсолютными только по умолчанию, что означает, что относительный импорт должен явно (как, from . import (...)). Это сила import trainer, чтобы импортировать весь пакет верхнего уровня, а не модуль.

Смежные вопросы