1 前言
最近項目中需要調用別人寫的python程序,所以在網上找了一些QT調用python的資料,個人感覺挺簡單的吧,自己寫了一個Demo測試了一下。
2 python環境部署
python下載地址:https://www.python.org/downloads/
可以下載自己需要的版本,但是在下載的時候需要注意是32位還是64位,要看你使用的QT是32位還是64位的,
然後在安裝的時候注意勾選 添加到環境變量選項,如果沒有勾選則需要手動添加環境變量
3 編寫python程序
可以使用notepad++編寫一個簡單的python程序,將python文件命名爲“helloword.py"
def hellowordFunc():
print("helloword")
4 修改python與qt的衝突問題
從網上找了資料,我就直接修改這個地方了,修改python安裝目錄裏的“/include/object.h"文件,用找到“PyType_Spec”
然後修改如下:
#undef slots
typedef struct{
const char* name;
int basicsize;
int itemsize;
unsigned int flags;
PyType_Slot *slots; /* terminated by slot==0. */
} PyType_Spec;
#define slots Q_SLOTS
5 QT調用
1)創建一個QT工程
詳細步驟不解釋了,會QT的都明白
2)配置python環境
在.pro文件中添加python的include目錄以及,lib目錄,如下
INCLUDEPATH += -I D:\Python36-32\include
LIBS += -LD:\Python36-32\libs -lpython36
3)在cpp文件中包含頭文件
#include <Python.h>
4)在cpp中添加代碼
//進行初始化
Py_Initialize();
//如果初始化失敗,返回
if(!Py_IsInitialized())
{
qDebug() << "IsInitialized: error";
}
//導入.py文件
PyObject *pModule = PyImport_ImportModule("helloword");
if(!pModule)
{
qDebug() << "ImportModule: error";
}
//hellowordFunc
PyObject * pFuncHello = PyObject_GetAttrString(pModule, "hellowordFunc");
//如果失敗則返回
if(!pFuncHello)
{
qDebug() << "GetAttrString: error";
}
//調用函數
PyObject_CallFunction(pFuncHello, NULL);
//退出
Py_Finalize();
執行帶參數方法
PyObject * pFuncFile = PyObject_GetAttrString(pModule, "newFile");
if(!pFuncFile)
{
qDebug() << "GetAttrString: error";
}
PyObject *args2 = PyTuple_New(1);
PyTuple_SetItem(args2, 0, PyUnicode_FromString("d:/test_py.txt"));
PyObject_CallObject(pFuncFile, args2);
5)解決無法加載“python36_d.lib"的問題
直接找到“D:\Python36-32\libs”中的“python36.lib"文件,複製一份並重命名爲“python36_d.lib"
6 結束語
好了,到這裏就完成了調用python程序的全過程,千萬要注意python的32位與64位要與QT的32位和64位適配,並且要添加python相關環境變量。