【问题标题】:How to create nested namespace packages for setuptools distribution如何为 setuptools 分发创建嵌套命名空间包
【发布时间】:2019-08-30 00:28:12
【问题描述】:

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

通过创建namespace package,我已经能够完成部分目标。我在命名空间“lvl1”中有“sub1”和“sub2”。我可以使用“pip install -e”或python setup.py develop在开发模式下安装这些。我可以使用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
            ...

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

【问题讨论】:

    标签: python namespaces package setuptools


    【解决方案1】:

    是的,方法不止一种。请阅读section "Nested namespace packages" in PEP 420

    在 python >= 3.3 中,创建嵌套命名空间的最简单方法是在每个可分发部分的特定文件夹(“lvl1”和“lvl2”)中删除(不包含)文件__init__.py。在每个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修改而来的

    【讨论】:

      猜你喜欢
      • 2016-01-31
      • 1970-01-01
      • 2012-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-18
      • 2011-01-06
      相关资源
      最近更新 更多