QT运行Python脚本

构建QT下的Python环境

在QT中,选择工具->选项->环境->外部工具,先添加目录,命名为RunPy,再在RunPy目录下添加工具Python3,设置执行档为C:\Users\32063\AppData\Local\Programs\Python\Python39\python.exe(即Python)的安装目录,设置参数为%{CurrentDocument:FilePath},工作目录为%{CurrentDocument:Path},如下图所示:
在这里插入图片描述

添加静态库

右击工程->添加库->选择外部库,设置库文件为C:\Users\32063\AppData\Local\Programs\Python\Python39\libs\python39.lib(根据自己的python路径选择),包含路径设置为C:\Users\32063\AppData\Local\Programs\Python\Python39\include,链接设置为静态,只勾选Windows,不要勾选为debug版本添加’d’作为后缀。如图所示:
在这里插入图片描述

遇到的坑

报错:error: expected unqualified-id before ‘;’ token,是因为python中的slots定义冲突了,需要重定义slots
在这里插入图片描述
添加静态库时,在pro文件里面,对于添加静态库后所添加的代码内容,只保留以下部分,剩下删掉

unix:!macx|win32: LIBS += -LC:/Users/32063/AppData/Local/Programs/Python/Python39/libs/ -lpython39

INCLUDEPATH += C:/Users/32063/AppData/Local/Programs/Python/Python39/include
DEPENDPATH += C:/Users/32063/AppData/Local/Programs/Python/Python39/include

代码实现

#include <Python.h>

void MainWindow::RunPY()
{
    Py_Initialize();
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.argv = ['python.py']");
    PyRun_SimpleString("sys.path.append('./')");
    PyObject* pModule = PyImport_ImportModule("main"); // 脚本文件的name,不能以text命名,否则会冲突
    if (!pModule)
     {
        PyErr_Print();
        std::exit(1);
         qDebug()<<"Cant open python file!\n";
     }
    qDebug()<<"file of python ac been opened";
    PyObject* pFunhello= PyObject_GetAttrString(pModule,"main");
    if(!pFunhello){
        qDebug()<<"Get function hello failed";
    }
    //调用temperImg函数
    PyObject_CallFunction(pModule,NULL);
    //结束,释放python
    Py_Finalize();
    qDebug()<<"end\n";

}

代码跑起来的坑

一、为了让代码跑起来,需要将python脚本文件跟QT的exe文件放在同一目录下,无论是debug版本还是release版本,都需要将python脚本和exe在同一目录。
二、python文件里面,需要指定其他文件或文件夹位置时,要使用绝对路径,相对路径会找不到,报错,不知原因,但想来应该能解决。


版权声明:本文为qq_46181090原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。