【问题标题】:ModuleNotFoundError: No module named cli.plugins.foo - How to build a plugin system?ModuleNotFoundError:没有名为 cli.plugins.foo 的模块 - 如何构建插件系统?
【发布时间】:2019-07-08 13:07:16
【问题描述】:

我已经构建了一个 python (3.6) CLI,它应该允许通过命名空间cli.plugins 加载插件。插件应该是单独的可测试存储库,用于导入 cli.utils 等模块以实现通用功能。

如果 CLI 具有文件夹结构:

 - cli
  - __init__.py
  - utils
   - plugins.py
   - __init__.py

并且插件有文件夹结构:

 - cli
  - plugins
   - foo
    - bar.py
    - __init__.py
 - tests
  - test_bar.py

当 Python 从 CLI 包中加载 cli 时,我在插件中的测试 test_bar.py 如何找到 bar.py?换句话说,如果两个包以相同的命名空间开头,它们是否无法导入另一个包?

【问题讨论】:

    标签: python-3.x


    【解决方案1】:

    重读以下内容后:Creating a namespace package...

    使用命名空间包的每个发行版都忽略 init.py 或使用 pkgutil 风格的 init.py,这一点非常重要。如果任何发行版不这样做,将导致命名空间逻辑失败,并且其他子包将无法导入。

    我从 CLI 的根目录中删除了 __init__.py。在此之后,CLI 中的所有模块都可以导入到插件中,并且 CLI 能够运行插件。

    - cli
      - utils
       - plugins.py
       - __init__.py
    
     - cli
      - plugins
       - foo
        - bar.py
        - __init__.py
      - tests
       - __init__.py
       - test_bar.py
    

    【讨论】:

      猜你喜欢
      • 2019-03-28
      • 2022-01-07
      • 2020-11-04
      • 2017-12-14
      • 2020-12-10
      • 2021-09-02
      • 2020-10-10
      • 2022-01-06
      相关资源
      最近更新 更多