Как создать вложенные пакеты пространства имен для распространения setuptools - PullRequest
3 голосов
/ 08 апреля 2019

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

Я смог достичь части своей цели, сделав пакет пространства имен .У меня есть "sub1" и "sub2", оба в пространстве имен "lvl1".Я могу установить их в режиме разработки, используя "pip install -e" или python setup.py develop.Я могу импортировать их с import lvl1.sub1 и import lvl1.sub2.

Однако проект масштабный и требует вложенных пространств имен .Я хочу import lvl1.lvl2.sub1 и import lvl1.lvl2.sub2.Таким образом, оба подпакета находятся в одном и том же пространстве имен ("lvl2"), которое само находится в пространстве имен ("lvl1").

Желаемая концептуальная структура:

lvl1/
    lvl2/
        sub1/
            code.py
            more_code.py
            ...
        sub2/
            code.py
            ...

Есть ли способсделать это и как?

1 Ответ

1 голос
/ 08 апреля 2019

Да, есть несколько способов.Пожалуйста, прочитайте раздел «Вложенные пакеты пространства имен» в PEP 420 .

. В python> = 3.3 самый простой способ создать вложенное пространство имен - удалить (не включать) файл __init__.py вопределенные папки ("lvl1" и "lvl2") в каждой распространяемой части.В каждом из setup.py явно перечислите все пакеты в самом глубоком пространстве имен.

"lvl1_part1 / setup.py"

setup(
    name='lvl1_part1',
    ...
    zip_safe=False,
    packages=['lvl1.lvl2.sub1']
)

"lvl1_part2 / setup.py"

setup(
    name='lvl1_part2',
    ...
    zip_safe=False,
    packages=['lvl1.lvl2.sub2']
)

Структура файла для тестирования:

lvl1_part1/
           setup.py
           lvl1/
                lvl2/
                     sub1/
                          __init__.py
lvl1_part2/
           setup.py
           lvl1/
                lvl2/
                     sub2/
                          __init__.py

Чтобы сделать вышеуказанные пакеты совместимыми со старыми версиями Python, добавьте pkgutil волшебный файл к каждому изПапки "lvl1" и "lvl2".

Кредиты: приведенный выше пример изменен с https://github.com/pypa/sample-namespace-packages/tree/master/pkgutil

...