繁体   English   中英

python命名空间包的当前状态

[英]Current state of python namespace packages

我想在主模块中有几个python子模块,但我想将它们作为单独的python包分发。 所以包A应该提供'my_data.source_a',包B应该提供'my_data.source_b',......等等。

我发现我必须使用命名空间包,但是试图找出细节,我找到了多个PEP来解决这个问题。 PEP 420似乎是最新的,它建立在PEP 402和PEP 382之上。

对我来说,不清楚实现的不同PEP的状态是什么。 所以我的问题是: http//pythonhosted.org/distribute/setuptools.html#namespace-packages仍然是要走的路,或者我应该如何构建我的命名空间包?

Python文档很好地描述了在Python中创建命名空间包的三种方法,包括何时使用这三种方法中的每一种的指南。 此外,本主题在不同的StackOverflow 线程中进行了深入讨论,该线程具有良好的接受答案 最后,如果您是一个宁愿阅读代码而非文档的人,那么sample-namespace-packages repo包含使用三种可用方法中的每一种创建的命名空间包的示例。

简而言之,如果您打算使用Python 3.3及更高版本的软件包,则应使用本机命名空间软件包方法。 如果您打算使用旧版本的Python,则应使用pkgutil方法 如果要将命名空间包添加到已使用pkg_resources方法的命名空间,则应继续使用方法。


使用本机命名空间包 ,我们可以从两个包中删除__init__.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.*'])
)
# 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.*'])
)

我们需要添加include=['my_data.*']的说法,因为在默认情况下find_namespace_packages()是,它包括作为命名的包,如所描述的文件夹,而宽松这里

这是支持Python 3.3及更高版本的软件包的推荐方法。


使用pkgutil style命名空间包 ,我们需要pkgutil添加到每个包中my_data.__init__.py文件中:

__path__ = __import__('pkgutil').extend_path(__path__, __name__)

这是backports命名空间使用的方法,以及google-cloud-python repo中的不同包,它是支持旧版Python的推荐方法。

Python 3.7的最新版本使用本机命名空间包方法来创建在PEP 420中定义的命名空间包。

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

  1. 使用本机命名空间包 这种类型的命名空间包在PEP 420中定义,可在Python 3.3及更高版本中使用。 如果命名空间中的包只需要支持Python 3并通过pip安装,则建议使用此方法。
  2. 使用pkgutil样式的命名空间包 对于需要支持Python 2和3以及通过pippython setup.py install新软件包,建议使用此方法。
  3. 使用pkg_resources样式的命名空间包 如果您需要与已使用此方法的软件包兼容,或者您​​的软件包需要是zip安全的,则建议使用此方法。

参考: 包装命名空间包

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM