Как создать вложенные пакеты пространства имен для распространения setuptools

Я разрабатываю проект 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
            ...

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
6
0
1 462
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Да, есть не один способ. Прочтите раздел «Вложенные пакеты пространства имен» в 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.

Другие вопросы по теме