如何处理将作为另一个包的依赖项的命名空间包

Posted

技术标签:

【中文标题】如何处理将作为另一个包的依赖项的命名空间包【英文标题】:How do I handle namespace packages that will serve as dependencies for another package 【发布时间】:2019-03-11 10:12:05 【问题描述】:

我写了三个 Python 模块,其中两个是独立的,但最后一个依赖于两个独立的模块。例如,考虑以下结构

myProject/
    subpackage_a/
        __init__.py
        ...
    subpackage_b/
        __init__.py
        ...
    mainpackage/
        __init__.py
        ...

mainpackage 依赖于subpackage_asubpackage_b,其中subpackage_asubpackage_b 可以独立使用。换句话说,在mainpackage 中,有对subpackage_asubpackage_b 的引用。简而言之,我希望用户能够在不调用mainpackage 的情况下执行from myProject import subpackage_a 并开始执行subpackage_a.subfunction(args)。我还希望用户使用from myProject import mainpackage 并开始使用mainpackage.mainfucntion(args),其中mainpackage.mainfucntion 将调用subpackages 中的函数。

我了解了命名空间打包。但是,我在涉及依赖项的命名空间包上找不到任何东西。如果有更好的解决方案,我不必使用命名空间打包。我能得到一些关于我应该寻找什么的建议吗?

【问题讨论】:

如果subpackage_asubpackage_b 是独立的,为什么要让它们成为子包而不是独立的库? 【参考方案1】:

无论如何,您都需要在各自的 setup.py 中为您的包指定一个名称,并且您可以在定义依赖项时简单地使用这些名称。这是一个稍微简化的示例,只有一个子包:

myProject
  sub/
    setup.py
    myProject/
      sub/
        __init__.py
  main/
    setup.py
    myProject/
      main/
        __init__.py

你的设置文件应该是这样的:

myProject/sub/setup.py

from setuptools import setup, find_namespace_packages

setup(
    name="my-project-sub",
    ...
    packages=find_namespace_packages(include=["myProject.*"]),
)

myProject/main/setup.py

from setuptools import setup, find_namespace_packages

setup(
    name="my-project-main",
    ...
    packages=find_namespace_packages(include=["myProject.*"]),
    install_requires=["my-project-sub"],
)

【讨论】:

以上是关于如何处理将作为另一个包的依赖项的命名空间包的主要内容,如果未能解决你的问题,请参考以下文章

如何导入 Python 命名空间包的所有子模块?

如何处理XML命名空间

防止私有和基于 pypi 的 Python 包之间的命名空间冲突

没有包的命名空间

使用 KissXML 处理 wcf Rest Web 服务 - 我应该如何处理命名空间问题

创建的 NuGet 包没有任何编译时程序集