Python 如何创建一个命名空间包

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

最终用户可以使用import namespace.module1和import namespace.module2。

Python 3.3上,你只需要在命名空间包目录中省略任何init .py文件,一切都会正常运行。这是因为Python 3.3引入了隐式命名空间包。

在旧版本上,有一个称为pkgutil的标准模块,你可以使用它将模块“添加”到给定的命名空间中。你应该在两个Packages中都加入这两行代码。

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

这将向包的路径中添加所有在sys.path中以该包命名的目录的子目录。然后,您可以将这两个包分别分发。

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

基本命名空间包

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

示例

#create a directory in linux with desired name
mkdir my_namespace/module1.py
#You can then import the module from the namespace package like this:
from my_namespace import module1

多个目录

您可以通过创建多个具有相同名称但没有 init.py 文件的目录来将命名空间包分割为多个目录。

示例

my_namespace/
dir1/
module1.py
dir2/
module2.py
#You can then import modules from the namespace package like this:
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
#You can then import the module from the namespace package like this:
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安装命名空间包,并像这样从命名空间包导入模块:

您可以使用pip install安装命名空间包,并像这样从命名空间包导入模块:

from my_namespace.module1 import my_function

使用setuptools在命名空间中创建命名空间包

您可以通过使用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 安装命名空间包,并像这样从命名空间包中导入模块:

from NamespacePackage.my_namespace.module1 import my_function

概括来说,以下是一些在Python中创建命名空间包的方法。它们允许您在多个包之间分发功能,并且使其更易于维护。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程