【问题标题】:Yapsy instantiates the wrong class when IPlugin is extended扩展 IPlugin 时 Yapsy 实例化了错误的类
【发布时间】:2014-07-04 22:09:28
【问题描述】:

我有以下文件结构,它使用Yapsy实现了一个非常简单的插件架构。

插件/BasePlugin.py

from yapsy.IPlugin import IPlugin

class BasePlugin(IPlugin):
    def process(self):
        # Do some stuff common to all plugins
        pass

插件/TestPlugin.py

from Plugins.BasePlugin import BasePlugin

class TestPlugin(BasePlugin):
    def process(self, info):
        super(TestPlugin, self).process()
        # Do stuff
        return "done"

test.py

from yapsy.PluginManager import PluginManager
from Plugins.BasePlugin import BasePlugin
import logging

logging.basicConfig(level=logging.DEBUG)
# See note 1
manager = PluginManager()   # Does not work
manager = PluginManager(categories_filter={'BasePlugin': BasePlugin}) # Works

def init_plugins():
    # Load the plugins from the plugin directory.
    manager.setPluginPlaces(["Plugins"])
    manager.collectPlugins()

    # Loop round the plugins and print their names.
    for plugin in manager.getAllPlugins():
        manager.activatePluginByName(plugin.name, "BasePlugin")
        print "Plugin path: {}".format(plugin.path)
        print "Plugin obj:  {}".format(plugin.plugin_object)

        result = plugin.plugin_object.process(info)

TestPlugin 也有正确的 .yapsy-plugin 信息文件。

没有过滤器(注 1)Yapsy 尝试实例化 BasePlugin 而不是我的 TestPlugin,尽管插件的名称是“TestPlugin”。例如:

Plugin path: /home/user/python/Plugins/TestPlugin
Plugin obj:  <Plugins.BasePlugin.BasePlugin object at 0x7f159af22050>

如果我包含过滤器,则插件会正确加载,我的 TestPlugin 类会被实例化并改为使用。

DEBUG:yapsy:Activating plugin: BasePlugin.test
Plugin path: /home/david/python/Plugins/TestPlugin
Plugin obj:  <yapsy_loaded_plugin_test_0.TestPlugin object at 0x7f4dad7d4050>

我在继承方面做错了什么,或者这正是 Yapsy 的工作方式?尽管找到了正确的文件,但我不明白为什么它会尝试使用 BasePlugin 而不是 TestPlugin。

我是否需要实现类别来扩展IPlugin 并提供我自己的基类?

【问题讨论】:

    标签: python plugins


    【解决方案1】:

    您遇到了一个已知的 yapsy 问题,这与它检测文件中的插件并对其进行分类的方式有关。

    这在 yapsy 的文档https://yapsy.readthedocs.org/en/latest/Advices.html#plugin-class-detection-caveat 的故障排除部分中进行了解释。

    由于这些已经是我自己的话,我就复制粘贴在这里,但如果有不清楚的地方,请随时要求精确。


    每个模块只能定义一个插件。这意味着你不能有两个插件描述文件指向同一个模块。

    由于“继承分类”系统,你不能在主插件文件中直接导入IPlugin的子类,而是导入其包含的模块,并使你的插件类继承自ContainingModule.SpecificPluginClass,如下所示例子。

    以下代码将不起作用(类MyBasePluginClass 将被检测为插件的实现而不是MyPlugin):

    from myapp.plugintypes import MyBasePluginClass
    
    class MyPlugin(MyBasePluginClass):
        pass
    

    相反,您应该执行以下操作:

    import myapp.plugintypes as plugintypes
    
    class MyPlugin(plugintypes.MyBasePluginClass):
        pass
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-04
      • 1970-01-01
      • 2021-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-24
      • 1970-01-01
      相关资源
      最近更新 更多