如何在 Python 中创建命名空间包?
在 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 中创建命名空间包的一些方法。它们允许您在多个包之间分配功能,并使其更易于维护。