упаковка общих пространств имен python

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

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

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

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

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

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

ОБНОВЛЕНИЕ

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

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

Со следующим в setup.py:

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

person Will Hardy    schedule 21.02.2011    source источник
comment
Вы смотрели на различные пакеты eGenix mx на PyPi? Посмотрите на них для примеров. Затем вы можете задать более конкретные вопросы на основе этого шаблона.   -  person S.Lott    schedule 21.02.2011
comment
То есть вы хотите сказать, что для пользователя не проблема установить два отдельных пакета с одним и тем же родительским пространством имен? Это никогда не вызовет никаких проблем? Пакеты mx имеют очень сложный процесс установки, я постараюсь выяснить, есть ли у них какие-либо специальные обходные пути для проблем с пространством имен.   -  person Will Hardy    schedule 21.02.2011
comment
Ваше обновление на самом деле является ответом, а не обновлением вашего вопроса. Я бы переместил его в ответ, чтобы мы могли проголосовать за него :)   -  person bukzor    schedule 02.03.2013


Ответы (1)


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

/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']
    ...
)

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

person jd.    schedule 21.02.2011
comment
Чудесно! Похоже, это полностью решает техническую проблему. Спасибо! - person Will Hardy; 21.02.2011