python - 在 Python 中实现插件系统

标签 python plugins

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

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

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

最佳答案

我已经用不同的平台和语言编写了很多不同的插件架构,我会说您对大多数插件系统的编写方式非常了解。

基本上可以归结为,您的主机和您的插件需要有某种共同的契约(Contract)才能使用;换句话说,您的宿主需要对您的插件有足够的了解,以便它可以传递或共享插件需要的任何公共(public)资源,并且插件需要对宿主有足够的了解才能与这些资源进行交互。

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

关于python - 在 Python 中实现插件系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6233447/

相关文章:

python - importlib.reload() 没有将文件重新加载到 ipython 笔记本中

python - 在 python 中将 1D 数组插入到 3D 数组网格中

python - Go - Python 的 "pass"相当于什么?

variables - Jenkins 插件 - 环境变量

authentication - Grails 通过 Spring Security 插件使用 Google 身份验证

security - Spring Security插件不引发事件

python - Pandas.DataFrame - 查找可用值的最早日期

python - 使用 SWIG 打印为 Python 包装的 C++ 类时不调用 __str__()

jQuery 插件 : Using setInterval to periodically update an array of jQuery elements

javascript - WP 插件 - SEO Smart Links 弄乱了我的插件