带有 Poetry 的 Python 命名空间包

Gep*_*pos 5 python python-poetry

我正在使用 Poetry 构建一些命名空间包。每个包的目录结构都是相同的:

package_bbb
    pyproject.toml
    aaa
        bbb
            myservice.py
            __init__.py
        __init__.py
Run Code Online (Sandbox Code Playgroud)

使用 Poetry 我可以构建一个轮子,安装它并使用该包:

package_bbb
    pyproject.toml
    aaa
        bbb
            myservice.py
            __init__.py
        __init__.py
Run Code Online (Sandbox Code Playgroud)

当我开始构建第二个包时,我的问题发生了,它需要第一个包作为依赖项。

结构保持不变:

package_ccc
    pyproject.toml
    aaa
        ccc
            mydata.py
            __init__.py
        __init__.py
Run Code Online (Sandbox Code Playgroud)

在诗歌中,我将第一个添加为依赖项:

from aaa.bbb import myservice
Run Code Online (Sandbox Code Playgroud)

该软件包将(来自实习生存储库)安装在生成的 virtualenv 中并添加到 pyproject.toml 中。

第二个包生成的轮子也是完美的。第一个包将由 pip 作为依赖项安装。

问题出在开发过程中:如果我尝试(例如在 mydata.py 内部从第一个包导入某些内容:

package_ccc
    pyproject.toml
    aaa
        ccc
            mydata.py
            __init__.py
        __init__.py
Run Code Online (Sandbox Code Playgroud)

我有一个模块未找到。我认为发生这种情况是因为我有 2 个 aaa 命名空间:一个在 virtualenv 中,一个在项目根目录中。第二个优先,没有aaa.bbb。

我是否遗漏了包结构中的某些内容,或者有办法避免这种“命名空间冲突”?

非常感谢你的帮助!

fin*_*mer 7

您需要__init__.pyaaa两个包的文件夹中删除 。否则aaa将被检测为普通包而不是命名空间包。有关更多详细信息,请参阅https://www.python.org/dev/peps/pep-0420/#specification 。