在Python中实现插件系统
我正在写一个应用程序(一个Minecraft的服务器封装),我希望它可以通过插件进行扩展。目前我有一个可以工作的系统,但我觉得从长远来看,它可能需要改进。
现在的做法是,应用程序在服务器类中调用一个叫“get_plugins”的方法。这个方法首先导入一个名为pluginutils.py的文件(这个文件定义了一个BasePlugin类,所有插件都要从这个类继承),然后它会遍历cmds目录下的每个.py文件,导入这些文件并检查它们是否是BasePlugin的子类。如果是,它就会把这个插件的实例存储在一个字典里,字典的键是插件中定义的一个cmd类变量。每当应用程序从服务器接收到一个命令时,它会检查这个命令是否在字典的键中,如果是,就会运行字典中存储的实例的start方法,并传入从命令中获取的必要参数。
虽然这个方法能工作,但我觉得这样做有点随意。有没有更好的方法来实现类似的系统?我想自己写这个(我不想使用像zope.interface这样的东西),因为这是一个学习的过程。谢谢。
2 个回答
0
我建议使用 setuptools,因为插件最终是和 sys.path
这个列表的管理有关的。
http://peak.telecommunity.com/DevCenter/PkgResources
从长远来看,像 setuptools 这样的分发/打包解决方案总是一个不错的选择,因为:
- 你需要加载插件时,避免出现冲突或缺少依赖的情况,
- 即使这些插件本身还依赖其他动态的东西,
- 而且你还需要在安装和卸载包的时候,保持可用插件列表的更新。
2
我写过很多不同平台和语言的插件架构,所以我可以说,你的插件系统设计基本上是对的。
简单来说,插件和宿主(也就是使用插件的程序)之间需要有一些共同的约定,才能正常工作。换句话说,宿主需要了解插件的基本信息,这样才能提供插件所需的资源,而插件也需要了解宿主,以便能够使用这些资源。
你用基类和派生类来实现这个功能的方法是非常常见的做法。