基於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版本,也要求所作的後續衍生工做也要開源。若是用於商業應用,能夠購買相應的商業許可,而後用商業版從新編譯一次便可。

相關文章
相關標籤/搜索