如何为Python程序提供API以支持插件扩展?

5 投票
2 回答
513 浏览
提问于 2025-04-16 20:49

我在想,怎么才能为我的Python程序提供一个API,让别人可以用插件来扩展它呢?

我想到了类似于 from myProgram.plugins import aClassToExtendByOthers, registerThatClass 这样的方式。但是我不知道该怎么实现这个功能。

我可以在我的 loadPlugins 函数里使用exec语句来加载插件文件夹中的每一个插件,但这样做并不能让别人方便地导入我想提供的东西,以便他们编写这些插件。

2 个回答

0

你可以使用 imp 模块(具体可以查看 docs.python.org)

sys.path.insert(0, pluginsDir)
lst = map(lambda x: os.path.splitext(os.path.basename(x))[0], glob.glob(os.path.join(pluginsDir, "*.py")))
for module in lst:
try:
  f, fn, d = imp.find_module(module,[pluginsDir])
  loaded = imp.load_module(module, f, fn, d)

想看一个完整的例子,可以看看 ojuba 控制中心的加载器

http://git.ojuba.org/cgit/occ/tree/OjubaControlCenter/loader.py

2

我在几个程序中使用的一个系统里,我定义了一个插件目录,并提供了一个基础插件类,让所有插件都可以从这个类继承。接着,我会导入这个目录里的所有模块,然后通过检查它们是否继承了我的基础插件类来选择性地初始化它们,并把插件的实例存储在一个字典(或列表)里。我发现命令分发模式对我来说是一个很有效的方式,可以帮助我组织插件和传递事件。基础插件(或者其他可选的接口类)可以提供插件与应用程序互动所需的方法。希望这些对你有帮助。这可能不是最好的方法,但对我来说是有效的。

另外,你还可以做一些额外的过滤,比如要求插件文件有一个特定的前缀(例如 __plug_file.py____plug_other.py__)。

撰写回答