如何为 setuptools 分发创建嵌套的命名空间包
How to create nested namespace packages for setuptools distribution
我正在开发一个 python 项目,该项目将包含可单独分发的部分。
我已经通过 namespace package 完成了我的部分目标。我有 "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
...
有没有办法做到这一点以及如何做到这一点?
是的,方法不止一种。请阅读section "Nested namespace packages" in PEP 420。
在 python >= 3.3 中,创建嵌套命名空间的最简单方法是删除(不包含)特定文件夹("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
magic file 添加到 "lvl1" 和 "lvl2" 文件夹中。
学分:上面的例子修改自https://github.com/pypa/sample-namespace-packages/tree/master/pkgutil
我正在开发一个 python 项目,该项目将包含可单独分发的部分。
我已经通过 namespace package 完成了我的部分目标。我有 "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
...
有没有办法做到这一点以及如何做到这一点?
是的,方法不止一种。请阅读section "Nested namespace packages" in PEP 420。
在 python >= 3.3 中,创建嵌套命名空间的最简单方法是删除(不包含)特定文件夹("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
magic file 添加到 "lvl1" 和 "lvl2" 文件夹中。
学分:上面的例子修改自https://github.com/pypa/sample-namespace-packages/tree/master/pkgutil