如何在 Python 3 中创建 Python 命名空间包?
使用命名空间包,您可以将一个包的子包和模块分布到许多独立的发布包中(在本文档中称为发布,以避免歧义)。
在 Python 中,命名空间包允许您将 Python 代码分散到多个项目中。当您希望将相关的库作为单独的下载发布时,这很有用。
创建命名空间包
目前,有三种方法可以开发命名空间包。这些方法如下所述。
使用包作为原生命名空间。此类命名空间包的 PEP 420 规范指出,Python 3.3 及更高版本支持它。如果您的命名空间中的包只需要支持 Python 3 和 pip 安装,那么建议这样做。
在 pkgutil 样式中使用命名空间包。对于需要支持 Python 2 和 3 以及通过 pip 和 python setup.py install 进行安装的新包,建议使用此方法。
以 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/ # No __init__.py here. subpackage_a/ # Sub-packages have __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 # Namespace package __init__.py subpackage_a/ __init__.py # Sub-package __init__.py module.py