我想创建一个可以通过插件扩展的程序。我有一个结构,在安装所有包后似乎可以工作,但我不确定我所做的是否真的受支持:核心功能将由“普通”包提供,插件通过命名空间提供包。这是一个显示结构的最小示例:
- 00_core_package 为核心逻辑而不是命名空间包。
- 01_foo_plugin 和 02_bar_plugin 作为两个示例包,它们是名称空间包,名称空间根 (
myprog
) 与核心包相同。
当我在本地通过pip install .
这三个包时,一切似乎都工作正常,但我不确定这是否真的是命名空间包的受支持用例。我的担忧是:
- Python Packaging User Guide和引用的示例项目仅描述了两个子包都是真正的命名空间包的用例,即“根”命名空间本身不是独立的包。它还指出:
使用命名空间包的每个发行版都忽略
__init__.py
或使用 pkgutil-style是非常重要的__init__.py
。如果任何发行版没有,它将导致命名空间逻辑失败,并且其他子包将无法导入。
- 正如您在屏幕截图中看到的,PyCharm 无法正确索引项目,并且无法解析插件的导入。我可以通过以下任一方式解决此问题:
- 将 00_core_package 取消标记为源根目录 - 这是不切实际的,因为我想将所有相关代码保留在同一个项目中。
- 使核心包本身成为名称空间包,并将所有内容放在下面
myprog.core
。
PyCharm 中的导入错误是我在这里做错了什么的第一个迹象,还是这更像是 PyCharm 本身的错误?