如何为 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.sub1import lvl1.sub2.

导入它们

但是,该项目规模庞大,需要嵌套命名空间。我想要 import lvl1.lvl2.sub1import 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