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