Qt 调用Python引擎混合编程
0、前言
使用Qt和Python做混合編程,充分發揮Qt GUI的圖形化框架優勢和Python數據處理的計算能力。復雜的計算可用到Python眾多三方庫,將Python需要執行的功能寫成py文件,做成插件的形式,被Qt c++調用,修改py文件即可實現一套GUI框架多種內核算法的效果。本文使用Qt調用Python三方庫做多高維數據MDS降維計算。
1、運行環境
以下測試在windows10主機測試成功。需要注意Qt的位數需要和Python的位數一致。
- Qt 5.12.0 32bit,MinGW-32bit編譯器。
- Python 3.7.3 32bit
2、Python CAPI的使用文檔
Python/C API Reference Manual — Python 3.10.0 documentation
3、Qt配置環境
將Python安裝的文件夾復制以下內容到Qt工程中,此處是復制到release文件夾下,以便Qt生成的可執行程序能夠在當前目錄下找到Python。libs文件夾下有python3.dll,python37.dll,一起復制到release目錄。
?項目文件.pro 添加Python依賴頭文件和庫,指定位置為剛剛復制的文件夾內。
4、Qt調用Python示例
?在需要引用Python的文件添加頭文件引用,Python的slots和Qt的slots關鍵字沖突,所以按以下方式添加引用。
?編寫初始化插件接口,只用調用一次。項目頭文件中添加PyObject* py_module; PyObject* py_dic; PyObject* py_func;這些變量無需用Py_DECREF清理,Python內部自動清理(測試中發現一旦清理,再次運行就崩潰)。
由于需要打包發布應用程序,因此需要指定可執行文件尋找的Python主目錄,通過以下代碼實現
QString path = QCoreApplication::applicationDirPath() + "/python37_32"; Py_SetPythonHome((wchar_t*)(reinterpret_cast< const wchar_t* >(path.utf16())));??若是多線程調用,則需要使用Python全局鎖GIL,參考網上的資源,新建一個PyThreadStateLock類,在任何多線程調用Python的位置,先實例化一個PyThreadStateLock。
?
??
??編寫接口調用Python插件計算,主要用到的CAPI如下所示,使用方法可以參考官方文檔說明。
- PyList_New
- PyList_SetItem
- PyList_GetItem?
- Py_BuildValue
- PyTuple_New
- PyObject_CallObject?
- PyObject_Size
- PyArg_Parse
被調Python三方庫的接口如下:
5、程序打包發布
Qt編譯的應用程序按照windeployqt常規方式打包,需要注意的是要將release文件夾下的Python文件夾復制到打包后的目錄下,同時復制python3.dll,python37.dll到可執行程序的根目錄。
總結
以上是生活随笔為你收集整理的Qt 调用Python引擎混合编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle未过账是什么意思,EBS R
- 下一篇: 实例54:python