2011-06-03 64 views
8

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

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

虽然这样做,我觉得这是一个马虎的做法。有没有更好的技术来实现类似这样的系统?我想自己写这个(我不想使用任何类似zope.interface的东西),因为这是一种学习体验。谢谢。

+0

我好奇; **如何检查插件是否具有子类BasePlugin类? – tMC 2011-06-03 23:13:20

+0

@tMC您可以使用Class .__子类__(),它返回类(BasePlugin)的子类列表。我检查他们对这个名单。 – 2011-06-03 23:15:46

+0

谢谢,我不知道;这将是非常有用的! – tMC 2011-06-03 23:18:11

回答

2

在不同的平台和语言中编写了很多不同的插件体系结构之后,我会说你已经掌握了大部分插件系统的写法。

基本上它归结为什么,你的主机和你的插件需要有一些共同的合同工作;换句话说,您的主机需要充分了解您的插件,以便它可以传递或共享插件所需的任何常用资源,并且插件需要足够了解主机与这些资源进行交互。

像你所做的那样,使用基类和派生类来实现这是一种非常常见的方法。

+0

我所做的研究基本上让我知道你在说什么。我只是觉得实施,因为我有点sl。。 – 2011-06-04 19:53:53

0

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

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

从长远来看,分配/包装基础的解决方案就像setuptools的将永远是一个坚实的选择,因为:

  • 你必须加载插件没有冲突或缺少requi
  • 即使加载插件依赖于其他动态依赖关系,并且
  • 您必须在安装和删除程序包时更新可用插件的列表。