在Python中构建简约插件架构
我有一个用Python写的应用程序,主要是给一些技术性比较强的用户(比如科学家)使用。
我想找个好办法,让用户可以扩展这个应用,也就是说,想要有一个脚本或插件的架构。
我希望这个架构非常轻量级。大多数脚本或插件不会是第三方开发和分发的,而是用户自己花几分钟时间写出来的,用来自动化一些重复的任务,或者添加对某种文件格式的支持等等。所以插件的代码应该尽量简单,不需要太多的准备工作,只要把它复制到一个文件夹里就行(像setuptools的入口点,或者Zope的插件架构感觉就太复杂了)。
有没有这样的系统已经存在,或者有什么项目实现了类似的方案,我可以参考一下,获取一些灵感?
18 个回答
你可以看看这个链接,里面有关于现有插件框架和库的概述,挺适合入门的。个人比较喜欢 yapsy,不过具体要看你的使用场景。
module_example.py
:
def plugin_main(*args, **kwargs):
print args, kwargs
loader.py
:
def load_plugin(name):
mod = __import__("module_%s" % name)
return mod
def call_plugin(name, *args, **kwargs):
plugin = load_plugin(name)
plugin.plugin_main(*args, **kwargs)
call_plugin("example", 1234)
这个例子确实是“最简单”的,它没有任何错误检查,可能存在无数的安全问题,而且灵活性也不高——但它应该能让你明白,在Python中,插件系统可以是多么简单。
你可能还想看看imp模块,虽然你只用__import__
、os.listdir
和一些字符串处理,就能做很多事情。
我的做法是创建一个叫“plugins”的文件夹,主程序可以定期查看这个文件夹,然后用 imp.load_module 来加载里面的文件,寻找一个大家都知道的入口点,可能还会有一些模块级的配置参数。然后就可以从这里开始使用这些插件。我还用了一些文件监控的工具,这样可以动态地管理哪些插件是活跃的,不过这只是一个锦上添花的功能。
当然,如果有需求说“我不需要[大而复杂的东西] X;我只想要一些轻量级的东西”,那么就有可能会一步一步地重新实现 X 的某些功能。但这并不意味着你不能在这个过程中找到乐趣 :)