如何在yapsy插件中定义类别?

3 投票
1 回答
1373 浏览
提问于 2025-04-17 09:03

我在这个结构中使用了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和它的文档,考虑到用户的反馈,比如你的意见。

撰写回答