我可以混合使用普通包和命名空间包吗?

问题描述

我想创建一个可以通过插件扩展的程序。我有一个结构,当所有软件包都安装好时,它似乎正在工作,但我不确定我在做什么实际上是受支持的: 核心功能将由“普通”包提供,插件通过命名空间包提供。 这是一个显示结构的最小示例:

Project Structure

  • 00_core_package 用于核心逻辑,并且不是命名空间包。
  • 01_foo_plugin 和 02_bar_plugin 作为两个示例包,它们是命名空间包,命名空间根 (myprog) 与核心包相同。

当我通过 pip install . 在本地使用这三个包时,似乎一切正常,但我不确定这是否真的是命名空间包支持的用例。我的担忧是:

使用命名空间包的每个发行版都省略 __init__.py 或使用 pkgutil 样式的 __init__.py,这一点非常重要。如果任何分发没有,都会导致命名空间逻辑失败,其他子包将无法导入。

  • 正如您在屏幕截图中看到的,PyCharm 无法正确索引项目,并且无法解析插件的导入。我可以通过以下任一方式解决此问题:
    • 取消将 00_core_package 标记为源根目录 - 这不切实际,因为我想将所有相关代码保留在同一个项目中。
    • 例如,使核心包成为命名空间包本身,并将所有内容放在 myprog.core 下。

PyCharm 中的导入错误是我在这里做错的第一个迹象,还是 PyCharm 本身的错误

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)