python命名空间包的当前状态

python命名空间包的当前状态,python,distutils,namespace-package,Python,Distutils,Namespace Package,我希望在主模块中包含几个python子模块,但我希望将它们作为单独的python包分发。所以包A应该提供“my_data.source_A”,包B应该提供“my_data.source_B”。。。等等 我发现我必须为此使用一个名称空间包,但为了弄清楚细节,我发现多个PEP覆盖了这个问题。PEP 420似乎是最新的一个,它建立在PEP 402和PEP 382的基础上 对我来说,不清楚不同的政治公众人物和实施的状态是什么。因此,我的问题是:还有一条路要走,或者我应该如何构建名称空间包?很好地描述了在

我希望在主模块中包含几个python子模块,但我希望将它们作为单独的python包分发。所以包A应该提供“my_data.source_A”,包B应该提供“my_data.source_B”。。。等等

我发现我必须为此使用一个名称空间包,但为了弄清楚细节,我发现多个PEP覆盖了这个问题。PEP 420似乎是最新的一个,它建立在PEP 402和PEP 382的基础上

对我来说,不清楚不同的政治公众人物和实施的状态是什么。因此,我的问题是:还有一条路要走,或者我应该如何构建名称空间包?

很好地描述了在Python中创建名称空间包的三种方法,包括何时使用这三种方法的指导原则。此外,本主题在另一个具有良好效果的StackOverflow中进行了深入讨论。最后,如果您喜欢阅读代码而不是文档,repo包含使用三种可用方法中的每种方法创建的名称空间包的示例

简言之,如果您想让包使用Python 3.3及以上版本,那么应该使用该方法。如果您希望您的软件包能够使用较旧版本的Python,那么应该使用。如果要将命名空间包添加到已在使用的命名空间中,则应继续使用方法


使用本机名称空间包,我们可以从两个包中删除
\uuuu init\uuuu.py
,并修改setup.py文件,如下所示:

# setup.py file for my_data.source_a
from setuptools import setup, find_namespace_packages

setup(
    name="my_data.source_a",
    version="0.1",
    packages=find_namespace_packages(include=['my_data.*'])
)
我们需要添加
include=['my_data.*]
参数,因为默认情况下
find_namespace_packages()
在作为命名空间包包含的文件夹中非常宽松,如前所述

这是支持Python 3.3及以上版本的软件包的推荐方法


对于
pkgutil
风格的命名空间包,我们需要在每个包中的
my_数据中添加以下行


这是名称空间和repo中的不同包所使用的方法,也是支持旧版本Python的推荐方法。

最新版本的Python(即Python 3.7)使用该方法创建在中定义的名称空间包。

目前有三种不同的方法来创建命名空间包:

  • 使用。这种类型的命名空间包在中定义,在Python 3.3及更高版本中可用。如果命名空间中的包只需要通过
    pip
    支持Python 3和安装,则建议使用此选项
  • 使用。对于需要通过
    pip
    Python setup.py install
    支持Python2和3并进行安装的新软件包,建议使用此选项
  • 使用。如果您需要与已使用此方法的包兼容,或者您的包需要是zip安全的,则建议使用此方法
  • 参考:

    # setup.py file for my_data.source_b
    from setuptools import setup, find_namespace_packages
    
    setup(
        name="my_data.source_b",
        version="0.1",
        packages=find_namespace_packages(include=['my_data.*'])
    )
    
    __path__ = __import__('pkgutil').extend_path(__path__, __name__)