Как создать пакеты пространства имен в Python? - PullRequest
2 голосов
/ 04 июля 2011

У меня есть проект Python 3 со следующей структурой:

project/
|
+--root/
   |
   +--__init__.py
   |
   +--sub/
      |
      +--__init__.py
      |
      +--actualcode.py

Я хочу использовать «пакеты пространства имен», чтобы моя библиотека разделяла общее пространство имен с другими связанными библиотеками в отдельных проектах.Оператор импорта должен выглядеть следующим образом:

from root.sub.actualcode import something

Файл __init__.py в корневой папке содержит следующую инструкцию для создания пакета пространства имен:

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

Но я не могу сослаться накод, когда я импортирую root.sub.Это работает, только когда я пишу:

from sub.actualcode import something # doesn't work with "root.sub..."!

Что я должен сделать, чтобы использовать root в качестве пространства имен?

Ответы [ 2 ]

0 голосов
/ 06 июля 2011

Пакеты пространств имен могут быть собраны с , распространяют . Хитрость заключается в том, чтобы добавить следующую строку к параметру setup:

setup(
  # ...
  namespace_packages  = ["root"]
)

Остальная часть примера в вопросе верна.

0 голосов
/ 04 июля 2011

Я только что попробовал ваш пример, но, похоже, он работает так, как вы хотите:

    >>> from root.sub.actualcode import foo
    >>> foo()
    Bar!

Я запустил интерпретатор Python из каталога, содержащего папку root. Я создал пустые __init__.py файлы и мой actualcode.py выглядит так:

    #!/bin/python3

    def foo():
        print("Bar!")

Разница в том, что мои __init__.py файлы пусты.

...