win10 + QT5.9.3 調用python程序(.py)

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相關環境變量。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章