如何在Python 3中创建Python命名空间包?
使用命名空间包,可以将一个包的子包和模块分发给许多独立的分发包(在本文档中称为分发),以避免歧义。
在Python中,命名空间包允许将Python代码分散在多个项目中。 当您想要将相关的库发布为独立的下载时,这非常有用。
阅读更多:Python 教程
创建命名空间包
目前,有三种方法可以开发命名空间包。这些方法如下所示。
- 使用本地命名空间的包。 PEP 420的此类命名空间包规范指出,Python 3.3及更高版本支持它。 如果你的命名空间中的包只需要支持Python 3和pip安装,则建议这样做。
-
在pkgutil样式中使用命名空间包。 对于需要支持Python 2和3以及通过pip和python setup.py安装的新包,建议使用此方法。
-
在pkg资源方式中使用命名空间包。 如果您的包需要支持zip安全性或者您需要将其与已经使用它的其他包一起使用,则建议使用这种方法。
示例1
例如,在PYTHONPATH中有Package-1和Package-2目录,最终用户可以导入namespace.module1并导入namespace.module2。 下面的代码显示了每个包中的名称空间。
Package-1/namespace/__init__.py
Package-1/namespace/module1/__init__.py
Package-2/namespace/__init__.py
Package-2/namespace/module2/__init__.py
示例2
这个例子可以用来理解当子包是Python包中的一部分时,如何存在名称空间。
mynamespace/
__init__.py
subpackage_a/
__init__.py
...
subpackage_b/
__init__.py
...
module_b.py
Setup.p
本地命名空间的包
PEP 420中的隐式命名空间包已添加到Python 3.3中。 您只需要从包含命名空间包的目录中删除__init .py即可建立本地命名空间包。 文件结构的一种模型
setup.py
mynamespace/
# 这里没有__init__.py。
subpackage_a/
# 子包有__init__.py。
__init__.py
module.py
使用pkgutil样式的命名空间包
示例
pkgutil模块和pkgutil.extend path()函数首次在Python 2.3中提供。这可以用于声明必须与Python 2.3以及之后版本和Python 3一起使用的名称空间包。最高兼容性的最佳方法是采用此方法。 您必须包括一个__init .py文件来构建pkgutil样式的命名空间包−
setup.py
mynamespace/
__init__.py # 命名空间包__init__.py
subpackage_a/
__init__.py # 子包__init__.py
module.py