如何在yapsy插件中定义类别?
我在这个结构中使用了yapsy:
script.py plugins |-equipments | |-eq1.py | |-eq1.yapsy-plugin |-tasks |-tsk1.py |-tsk1.yapsy-plugin
script.py
from yapsy.PluginManager import PluginManager
# Load the plugins from the plugin directory.
manager = PluginManager()
manager.setPluginPlaces(["plugins"])
manager.collectPlugins()
# Loop round the plugins and initialization.
for plugin in manager.getAllPlugins():
print plugin.plugin_object.init_plugin()
print plugin.path
print plugin.category
这个运行得很好。但是我该怎么做才能让不同目录下的插件有不同的分类呢?
1 个回答
2
在yapsy中,分类不是通过文件夹来识别的,而是通过每个插件实例所继承的类来识别。
举个例子,在你的应用中,你可以让“设备”插件继承一个叫做IEquipementPlugin
的类,而“任务”插件则继承一个叫做ITaskPlugin
的类。
然后,当你配置插件管理器时,只需要将你的分类名称和它们各自的基础类进行对应即可:
# Define the various categories corresponding to the different
# kinds of plugins you have defined
manager.setCategoriesFilter({
"Equipement" : IEquipementPlugin,
"Task" : ITaskPlugin,
})
请注意一个警告,如果你的某个分类是由定义了另一个分类的子类来定义的,这样会让插件管理器感到困惑,这样做是有风险的。你可以查看Stack Overflow上的相关问题和相应的错误报告。
关于yapsy的文档也可以参考:http://yapsy.sourceforge.net/#more-sophisticated-plugin-classes。
我知道yapsy的文档在示例方面还不够完善[1],但在单元测试中有一些关于插件分类的有效示例。
在一些真实项目中也有分类的示例。例如在mathbench项目中:http://mathbench.sourceforge.net/(yapsy最初是作为它的一个子组件设计的),还有其他在yapsy文档中列出的项目,见http://yapsy.sourceforge.net/index.html#brief-history。
[1]: 对此我很抱歉,我没有太多时间来处理这个问题,但我会尽量逐步改进yapsy和它的文档,考虑到用户的反馈,比如你的意见。