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

try*_*lve 5 python namespaces setuptools package

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

myProject/
    subpackage_a/
        __init__.py
        ...
    subpackage_b/
        __init__.py
        ...
    mainpackage/
        __init__.py
        ...
Run Code Online (Sandbox Code Playgroud)

mainpackage取决于subpackage_aand subpackage_b,其中 assubpackage_asubpackage_b可以独立使用。换句话说,在 中mainpackage,有对subpackage_a和 的引用subpackage_b。简而言之,我希望用户能够from myProject import subpackage_asubpackage_a.subfunction(args)不调用mainpackage. 我还希望用户使用from myProject import mainpackage并开始使用mainpackage.mainfucntion(args),在那里mainpackage.mainfucntion将调用subpackages 中的函数。

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

kor*_*tyi 0

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

myProject
  sub/
    setup.py
    myProject/
      sub/
        __init__.py
  main/
    setup.py
    myProject/
      main/
        __init__.py
Run Code Online (Sandbox Code Playgroud)

您的设置文件应如下所示:

myProject/sub/setup.py

myProject
  sub/
    setup.py
    myProject/
      sub/
        __init__.py
  main/
    setup.py
    myProject/
      main/
        __init__.py
Run Code Online (Sandbox Code Playgroud)

myProject/main/setup.py

from setuptools import setup, find_namespace_packages

setup(
    name="my-project-sub",
    ...
    packages=find_namespace_packages(include=["myProject.*"]),
)
Run Code Online (Sandbox Code Playgroud)