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

pythonserver side programmingprogramming

在 Python 中,命名空间包是一种将单个 Python 包拆分到多个目录甚至多台计算机的技术。它允许开发人员将功能分布到多个包中,并使其更易于维护。

命名空间包是没有 init .py 文件而是依赖其他包来提供它的包。

Python 中的命名空间包允许您将代码分散到多个项目中。当您想将相关库作为单独的下载发布时,这很有用。例如,在 PYTHONPATH 中,Package-1 和 Package-2 目录如下:

Package-1/namespace/ init .py Package-1/namespace/module1/ init .py Package-2/namespace/ init .py
Package-2/namespace/module2/ init .py

最终用户可以导入 namespace.module1 和导入 namespace.module2。

在 Python 3.3 中,您需要做的就是从命名空间包目录中删除所有 init .py 文件,然后一切都会正常运行。这是因为 Python 3.3 引入了隐式命名空间包。

在旧版本中,有一个名为 pkgutil 的标准模块,您可以使用它将模块"附加"到给定的命名空间。您应该将这两行放在两个包中。

1/namespace/__init__.py 和 Package-2/namespace/__init__.py:
from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)

这会将 sys.path 上以包命名的目录的所有子目录添加到包的 path__ 中。此后,您可以分别分发这两个包。

以下是一些在 Python 中创建命名空间包的方法 -

基本命名空间包

创建命名空间包的最简单方法是创建一个具有所需名称且没有 init .py 文件的目录。

示例

#在 Linux 中创建一个具有所需名称的目录
mkdir my_namespace/module1.py
#然后,您可以像这样从命名空间包中导入模块:
from my_namespace import module1

多个目录

您可以通过创建具有相同名称且没有 __init__.py 文件的多个目录,将命名空间包拆分到多个目录中。

示例

 my_namespace/
dir1/
module1.py
dir2/
module2.py
#然后您可以从命名空间包中导入模块,如下所示:
from my_namespace.dir1.module1 import my_function1
from my_namespace.dir2.module2 import my_function2

使用 pkgutil 的命名空间包

您可以使用 pkgutil 创建命名空间包,方法是创建一个具有所需名称的目录,并添加一个包含以下代码的 pkgutil.py 文件:

示例

import pkgutil
__path__ = pkgutil.extend_path(__path__, __name__)
my_namespace/
pkgutil.py
module1.py
#然后,您可以像这样从命名空间包中导入模块:
from my_namespace.module1 import my_function

使用 pkg_resources 的命名空间包

您可以使用 pkg_resources 创建命名空间包,方法是创建一个具有所需名称的目录,并添加一个空的 __init__.py 文件和一个包含以下代码的 setup.py 文件:

示例

from setuptools import setup, find_namespace_packages
setup(
   name="my_namespace",
   packages=find_namespace_packages(include=["my_namespace.*"])
)
my_namespace/
   __init__.py
   setup.py
   module1.py

然后,您可以使用 pip install 安装命名空间包,并从命名空间包中导入模块,如下所示:

from my_namespace.module1 import my_function

setuptools 中带有 namespace_packages 的命名空间包

您可以使用 setuptools 创建命名空间包,方法是创建一个具有所需名称的目录,并添加一个空的 __init__.py 文件和一个带有以下代码的 setup.py 文件:

示例

from setuptools import setup, find_namespace_packages
setup(
   name="my_namespace",
   packages=find_namespace_packages(include=["my_namespace.*"])
)
my_namespace/
   __init__.py
   setup.py
   module1.py

然后,您可以使用 pip install 安装命名空间包,并从命名空间包中导入模块,如下所示:

from my_namespace.module1 import my_function

带有 pkg​​_resources 和 namespace_packages 的命名空间包

您可以通过创建一个具有所需名称的目录并添加一个空的 __init__.py 文件和一个带有以下代码的 setup.py 文件来创建同时具有 pkg​​_resources 和 namespace_packages 的命名空间包:

示例

from setuptools import setup
from setuptools import find_packages
from pkg
import NamespacePackage
setup(
   name="my_namespace",
   packages=find_packages(),
   namespace_packages=["NamespacePackage"]
)
NamespacePackage/
   my_namespace/
   init.py
   module1.py
   setup.py

然后,您可以使用 `pip install` 安装命名空间包,并从命名空间包中导入模块,如下所示:

```python
from NamespacePackage.my_namespace.module1 import my_function

总而言之,这些是在 Python 中创建命名空间包的一些方法。它们允许您在多个包之间分配功能,并使其更易于维护。


相关文章