【发布时间】: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 并提供我自己的基类?
【问题讨论】: