如何在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 and 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.py文件来使用pkgutil创建命名空间包:
示例
import pkgutil
__path__ = pkgutil.extend_path(__path__, __name__)
my_namespace/
pkgutil.py
module1.py
#然后,您可以像这样从命名空间包导入模块:
from my_namespace.module1 import my_function
使用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
然后,您可以使用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创建命名空间包
可以使用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"]
)
NamespacePackage/
my_namespace/
init.py
module1.py
setup.py
然后您可以使用pip install安装命名空间包,并像这样从命名空间包导入模块:
```python
from NamespacePackage.my_namespace.module1 import my_function
总之,这些是Python创建命名空间包的一些方法,它们允许您将功能分发到多个包中,并简化维护过程。