1 前言

最近项目中需要调用别人写的python程序,所以在网上找了一些QT调用python的资料,个人感觉挺简单的吧,自己写了一个Demo测试了一下。

2 python环境部署

python下载地址:https://www.python.org/downloads/

qt调用外部脚本python qt 调用 python_python

可以下载自己需要的版本,但是在下载的时候需要注意是32位还是64位,要看你使用的QT是32位还是64位的,

qt调用外部脚本python qt 调用 python_环境变量_02

然后在安装的时候注意勾选 添加到环境变量选项,如果没有勾选则需要手动添加环境变量

qt调用外部脚本python qt 调用 python_qt调用外部脚本python_03

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相关环境变量。