如何在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
Python

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

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

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

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

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

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

基本命名空间包

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

示例

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

多个目录

可以通过创建多个名称相同且没有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
Bash

使用pkgutil创建命名空间包

您可以通过创建一个所需名称的目录并添加一个包含以下代码的pkgutil.py文件来使用pkgutil创建命名空间包:

示例

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

from my_namespace.module1 import my_function
Bash

使用pkg_resources创建命名空间包

您可以通过创建一个包含所需名称的目录并添加一个空的init.py文件和一个带有以下代码的setup.py文件来使用pkg_resources创建命名空间包:

示例

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
Bash

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

from my_namespace.module1 import my_function
Bash

使用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
Bash

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

from my_namespace.module1 import my_function
Bash

使用pkg_resources和namespace_packages创建命名空间包

可以使用pkg_resources和namespace_packages同时创建命名空间包,只需创建一个同名目录并添加一个空的init.py文件和一个包含以下代码的setup.py文件:

示例

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

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

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

总之,这些是Python创建命名空间包的一些方法,它们允许您将功能分发到多个包中,并简化维护过程。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册