用Python实现插件系统

时间:2011-06-03 22:59:15

标签: python plugins

我正在编写一个应用程序(Minecraft的服务器包装器),我希望通过插件进行扩展。我有一个适用的系统,但我认为从长远来看它可以使用改进。

我现在拥有它的方式,应用程序在服务器类中调用“get_plugins”方法,首先导入一个名为pluginutils.py的文件(pluginutils.py定义一个BasePlugin类,所有插件都是子类),然后循环通过 cmds 目录中的每个.py文件,导入它并检查它是否是BasePlugin的子类。如果是,则将其实例存储在字典中,其中键是插件中定义的 cmd 类变量。每当应用程序从服务器接收命令时,它都会检查它是否是字典中的键,如果是,则运行存储在字典中的实例的start方法,它将从命令中获取必要的参数。

虽然这有效,但我觉得这是一种草率的方式。有没有更好的技术来实现类似的系统?我想自己写这个(我不想使用像zope.interface这样的东西)因为这是一次学习经历。感谢。

2 个答案:

答案 0 :(得分:2)

在不同的平台和语言中编写了不少不同的插件架构后,我会说大多数插件系统的编写方式都非常正常。

基本上归结为,您的主机和您的插件需要有某种共同合同才能使用;换句话说,您的主机需要足够了解您可以传递的插件或分享插件所需的任何常见资源,并且插件需要足够了解主机与这些资源进行交互。

使用基类和派生类实现它是一种非常常见的方法。

答案 1 :(得分:0)

我建议使用 setuptools ,因为插件最终会链接到sys.path列表的管理:

http://peak.telecommunity.com/DevCenter/PkgResources

从长远来看,基于分发/包装的解决方案(如 setuptools )始终是一个坚实的选择,因为:

  • 您必须加载插件而不会发生冲突或缺少要求,
  • 即使加载的插件依赖于其他动态依赖项,
  • 也是如此
  • 您必须在安装和删除软件包时更新可用插件列表。