2012-06-28 3 views
3

У меня возникла проблема с пакетами на основе имен python, и мне интересно, какое хорошее решение.Разработка с Python Namespaced Packages

Моя структура проекта аналогична следующей

project_name/ext/app_ext 

То есть проект я работаю. Он имеет зависимости, которые также находятся в одном и том же пространстве имен.

project_name/ext/base_ext 
project_name/ext/other_dependency 

Я работаю над пакетом имен приложений «app_ext» в приложении django. Тем не менее, у меня возникают проблемы с получением no module named app_ext.

Я думаю, что это связано с тем, как устанавливаются пакеты с расширением имен (я устанавливаю PIP). Пакеты с именованными именами не устанавливаются с файлами __init__.py, как это описано в документации по распространению/setuptools, но все они действительно содержат следующие объявления в своих установочных пакетах.

from pkgutil import extend_path 
__path__ = extend_path(__path__, __name__) 

Теперь на вопрос. Есть ли уловка для работы с пакетом с расширением имен, когда уже установлены некоторые связанные пакеты с именами?

+0

Не могли бы вы включить пустые файлы '__init __ .py' в каталоги пакетов? – JAB

+0

@JAB вы предлагаете ему вручную добавлять файлы '__init __. Py' в имя_проекта и создавать виртуальные каталоги пакетов в пакетах сайтов? –

+0

Если проблема заключается в том, что пакеты не признаются таковыми, то это должно работать, правильно? Поскольку '__init __. Py' фактически не должен содержать ничего, чтобы выполнять свою работу в качестве индикатора, что каталог, содержащий его, представляет собой пакет. Или, возможно, есть что-то, чего я здесь не вижу, учитывая использование термина «пакеты с именами», когда пакеты на самом деле являются пространствами имен для начала. Может ли PIP сделать какую-то магию, которая предотвратила бы добавление файла среди других файлов в установленных пакетах? – JAB

ответ

0

Одним из решений является изменение пути пакета с расширением имен для добавления локального пути. (если вы работаете в Django, вы можете добавить к вашим настройкам сниппет, как показано ниже.).

from os import path 
import sys 

PACKAGE_NAMESPACE = ["project_name", "ext"] 
VIRTUAL_PACKAGE = '.'.join(PACKAGE_NAMESPACE) 
__import__(VIRTUAL_PACKAGE) 
local_package = path.abspath(path.join(*PACKAGE_NAMESPACE)) 
sys.modules[VIRTUAL_PACKAGE].__dict__["__path__"].insert(0, local_package) 

Этот подход также используется в tiddlyweb проекта для имен tiddlywebplugins.

+0

, который чувствует себя довольно странно, но, похоже, работает, и это не очень навязчивое изменение. Спасибо за вашу помощь. – Aaron

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