基于Python插件的C++扩展框架

这里介绍一种典型的C++应用框架,使用Python进行扩展。好比GIMP/Blender/QGIS等等Linux上面的开源软件,还有不少商业软件也采用了这一技术路线。可是因为Python的灵活性,可使用C/C++直接扩展,或者基于SWIG、PyQt、PythonQt进行扩展,致使具体实现上存在较大的差别。大部分的关于Python插件介绍都是关于Python自己的,由于Pytho是个动态语言,实现这一点并不难(参考:http://my.oschina.net/u/2306127/blog/489795),但在不少应用中,对性能要求较高,通常须要用C/C++来实现。而后,把Python解释引擎嵌入进去,方便用户进行参数定制、功能扩展和模块组装。python

这里介绍一个笔者摸索的使用Qt+SIP+PyQt+Python的技术路线,是功能比较强大、技术成熟、封装工做量相对较小的一种,并且具备商业级的发展潜力。shell

1、插件体系的组成

1.1 主程序对象的Python封装

通常状况下,咱们把主程序的C++类经过SIP进行封装,而后就能够在Python Shell中经过Python直接调用了。缓存

1.2 集成脚本控制台和编辑窗口

而后再把Python的控制台集成到主程序窗口中,就能够直接经过Python控制主窗口的操做。这里须要干两件事情,一是把控制台窗口嵌入主窗口中,二是要把主程序的对象句柄传给Python解释器环境。若是由Python自行初始化,主窗口的对象和解释器的对象就不是同一个,没法相互操做。固然,也能够经过全局静态对象等方式共享主程序,但不建议这样作,会影响后续程序的可扩展性。当得到主程序的对象句柄后,全部基于该对象的脚本操做,就会在主程序中获得反映。固然,若是涉及到了线程操做,这个问题会变的至关复杂,这里不予讨论,假设都是在主线程中进行的操做。框架

1.3 插件管理器和插件运行组件

既然是插件结构,固然就不会只有几个插件了,而是容许大量的插件能够动态加载进来,所以就须要一个插件管理器。插件管理器首先完成插件的管理,包括安装、启用、卸载、显示信息等等,通常提供一个对话框来完成。插件管理组件还须要负责在系统启动时进行插件的加载,给插件提供查询接口以实现插件的相互调用,以及执行插件的运行和错误跟踪、日志记录等等。函数

2、插件的基本接口

插件通常包含load、unload、run、info、about等基本接口。工具

在load时要把运行的主程序环境句柄传送给插件,而插件应该将此缓存起来,后续就能够直接使用了,若是属于UI插件,此时执行添加菜单项、工具栏、注册事件响应的回调函数等操做。性能

run()用于执行真正的功能操做。spa

info()通常返回一个插件的元数据描述对象,而about()通常弹出一个插件本身的信息说明对话框。.net

在最后须要将插件卸载时,宿主程序调用unload()。插件

若是须要更复杂的控制,能够加入init()等函数。

原则上,插件接口应该是一个最小集合,这样便于使用和插件的开发。更多的功能应该放在插件加载完成后再行操做。

3、Qt+SIP+PyQt+Python插件系统

为何采用Qt+SIP+PyQt+Python这一套技术路线呢?

一、首先,要作一个基于C++的应用通常会有一个UI界面,用QT来作,简单美观跨平台。

二、Qt已经有成熟的PyQt的Python封装,能够直接引入基于python的界面访问库。若是用别的界面库,须要本身对界面库所有用Python封装一遍,这个工做量就至关大了,并且还有很大的技术难度,维护升级的成本也是至关高的。

三、SIP能够把本身的各类C++库快速封装为Python库,易于维护和更新、升级。本身的库和Qt的库就能够在Python中同时使用了。

四、主程序使用Qt来开发,经过统一的SIP方式进行对象的封装,并把接口传送到Python解释器的执行环境,这样Python的插件就能够访问到宿主程序的全部对象资源了。

五、为何没有使用SWIG呢?一样的缘由,由于Qt的界面库和PyQt的Python封装库已经成熟并且普遍使用了。

目前还缺乏的是一个插件的标准接口和插件管理器、插件运行的stub。

经过Qt开发一个插件管理器PluginsManager,执行启动时插件的扫描加载、宿主程序事件的分派管理、基于插件名称的功能调用、插件安装卸载启用禁用管理对话框等。PluginsManager在装入插件时,将把主程序句柄传送给插件,而插件将把该句柄链接到主程序的Python封装对象里,实现插件与宿主程序的内存对象的对接。

Qt+SIP+PyQt+Python技术路线,既能得益于Qt/PyQT的已有成果的强大功能和标准化的接口,技术难度和成本都是比较低的,并且所封装的库既能在C++的图形界面下运行,也能够独立出来经过python的shell直接执行,而不须要进行两次封装。

具体的实现,目前尚未发现现成的框架,等有时间了准备本身搞一个,你们有兴趣的也能够试一试,而后开源出来,共同完善。

须要注意一点:Qt/Sip/PyQt都提供了开源的免费GPL版本,也要求所作的后续衍生工做也要开源。若是用于商业应用,能够购买相应的商业许可,而后用商业版从新编译一次便可。

相关文章
相关标签/搜索