Python3 如何创建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和import 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
本地命名空间的包
Python 3.3中添加了PEP 420中的隐式命名空间包。您只需从包含命名空间包的目录中删除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一起使用的命名空间包。最兼容的做法是使用这种方法。为了使用pkgutil风格构建命名空间包,必须包含一个init.py文件。
setup.py
mynamespace/
__init__.py # Namespace package __init__.py
subpackage_a/
__init__.py # Sub-package __init__.py
module.py