在Python中实现插件系统

9 投票
2 回答
2702 浏览
提问于 2025-04-16 18:55

我正在写一个应用程序(一个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

我写过很多不同平台和语言的插件架构,所以我可以说,你的插件系统设计基本上是对的。

简单来说,插件和宿主(也就是使用插件的程序)之间需要有一些共同的约定,才能正常工作。换句话说,宿主需要了解插件的基本信息,这样才能提供插件所需的资源,而插件也需要了解宿主,以便能够使用这些资源。

你用基类和派生类来实现这个功能的方法是非常常见的做法。

撰写回答