Python 文档很好地描述了在Python 中创建命名空间包的三种方法,包括何时使用这三种方法的指南。此外,该主题在另一个 StackOverflow线程中进行了深入讨论,该线程具有良好的接受答案。最后,如果您喜欢阅读代码而不是文档,那么sample-namespace-packages
repo 包含使用三种可用方法中的每一种创建的命名空间包的示例。
简而言之,如果您希望您的包与 Python 3.3 及更高版本一起使用,您应该使用本机命名空间包方法。如果您希望您的包与旧版本的 Python 一起使用,您应该使用pkgutil
方法. 如果您打算将命名空间包添加到已经在使用pkg_resources
method的命名空间,则应继续使用 method.
使用本机命名空间包,我们可以__init__.py
从两个包中删除并修改我们的setup.py文件,如下所示:
# setup.py file for my_data.source_a
from setuptools import setup, find_namespace_packages
setup(
name="my_data.source_a",
version="0.1",
packages=find_namespace_packages(include=['my_data.*'])
)
# setup.py file for my_data.source_b
from setuptools import setup, find_namespace_packages
setup(
name="my_data.source_b",
version="0.1",
packages=find_namespace_packages(include=['my_data.*'])
)
我们需要添加include=['my_data.*']
参数,因为默认情况下find_namespace_packages()
,它在作为命名空间包包含的文件夹中相当宽松,如此处所述。
这是支持 Python 3.3 及更高版本的软件包的推荐方法。
使用pkgutil
-style 命名空间包,我们需要将以下行添加到每个包my_data.__init__.py
中的文件中:
__path__ = __import__('pkgutil').extend_path(__path__, __name__)
这是backports
命名空间和 repo 中不同包使用的google-cloud-python
方法,也是支持旧版本 Python 的推荐方法。