如何在 Python 3 中创建 Python 命名空间包?


使用命名空间包,您可以将一个包的子包和模块分布到许多独立的发布包(本文中称为发布以避免歧义)中。

在 Python 中,命名空间包允许您将 Python 代码分散到多个项目中。当您希望将相关的库作为单独的下载发布时,这很有用。

创建命名空间包

目前,有三种开发命名空间包的方法。这些方法如下所述。

  • 使用包用于原生命名空间。此类命名空间包的 PEP 420 规范指出,Python 3.3 及更高版本支持它。如果您的命名空间中的包只需要支持 Python 3 和 pip 安装,那么建议这样做。

  • 在 pkgutil 样式中使用命名空间包。对于需要支持 Python 2 和 3 以及通过 pip 和 python setup.py install 进行安装的新包,建议使用此方法。

  • 以 pkg resources 的方式使用命名空间包。如果您的包需要是 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

更新时间: 2022-09-16

2K+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告