我正在开发一个python项目,该项目将具有可单独分发的部分。
我已经能够通过制作命名空间包来实现我的部分目标。我有"sub1"和"sub2",都在命名空间"lvl1"中。我可以使用"pip install -e"或python setup.py develop
在开发模式下 pip 安装这些。我可以用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中,创建嵌套命名空间的最简单方法是删除(不包括(每个可分发部分的特定文件夹("lvl1"和"lvl2"(中的文件__init__.py
。在每个setup.py
中,显式列出最深命名空间中的所有包。
"lvl1_part1/设置.py">
setup(
name='lvl1_part1',
...
zip_safe=False,
packages=['lvl1.lvl2.sub1']
)
"lvl1_part2/设置.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 修改而来