如何为安装工具分发创建嵌套命名空间包



我正在开发一个python项目,该项目将具有可单独分发的部分。

我已经能够通过制作命名空间包来实现我的部分目标。我有"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
            ...

有没有办法做到这一点以及如何做到这一点?

是的,有多种方法。请阅读 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 修改而来

最新更新