2011-02-21 3 views
15

Я ищу пакет и загружаю библиотеку, которую я должен использовать PyPI в ближайшие дни, но я немного не уверен в моем подходе к пространству имен.упаковка общих пространств имен python

У меня есть несколько других несвязанных проектов с похожим подходом и хотелось бы дать им все одинаковое пространство имен. Например:

  • Библиотека 1 Пространство имен: abc.seo
  • Библиотека 2 Пространство имен: abc.ajax
  • Библиотека 3 Пространство имен: abc.ecommerce
  • и т.д.

Проблема заключается в том, что я не уверен, если возможно, чтобы два отдельных пакета (например, яйца) сосуществовали с одним и тем же родительским пространством имен. Является ли этот подход проблематичным, или есть способ его преодоления? Какой лучший подход?

Библиотеки не должны быть упакованы вместе, они слишком несвязаны. Я хотел бы получить это прямо перед загрузкой, чтобы избежать болезненных изменений пространства имен после создания «официального» релиза.

(NB abc не настоящее имя, я хотел, чтобы мой вопрос, чтобы быть свободным от рекламы)

UPDATE

Я пошел с нижеследующим, чтобы быть хорошим для людей без Setuptools установлено:

try: 
    __import__('pkg_resources').declare_namespace(__name__) 
except ImportError: 
    __path__ = __import__('pkgutil').extend_path(__path__, __name__) 

следующее в setup.py:

setup(
    ... 
    namespace_packages = ['rollyourown'], 
    ... 
+1

Вы просматривали различные пакеты eGenix 'mx' на PyPi? Посмотрите на них на примерах. Затем вы можете задать более * конкретные * вопросы на основе этого шаблона. –

+0

Итак, вы хотите сказать, что для пользователя не сложно установить два отдельных пакета с одним и тем же родительским пространством имен? Это никогда не вызовет никаких проблем? Пакеты 'mx', кажется, имеют очень сложный процесс установки, я постараюсь изо всех сил увидеть, есть ли у них какие-либо специальные методы решения проблем пространства имен. –

+0

Ваше «обновление» на самом деле является ответом, а не обновлением вашего вопроса. Я бы переместил его, чтобы ответить, поэтому мы можем проголосовать за него :) – bukzor

ответ

15

В каждом базовом проекте каталога, создайте следующую структуру:

/setup.py 
/abc/__init__.py 
/abc/seo/ 

/abc/__init__.py содержит:

__import__('pkg_resources').declare_namespace(__name__) 

setup.py содержит:

setup(..., 
    packages: ['abc', 'abc.seo'], 
    namespace_packages = ['abc'] 
    ... 
) 

Справочная документация: namespace packages.

+0

Замечательно! Похоже, он полностью решает техническую проблему. Благодаря! –

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