Henkk

导航

QT中调用python中的函数

1. 创建py文件例如 名为“python_script.py”的python文件:

# python_script.py
def greet(name):
    return "Hello, " + name + "!"

 

2. Qt的pro文件中包含python 的头文件和库

INCLUDEPATH += python解释器的安装目录\include
LIBS += -Lpython解释器的安装目录\libs -lpython38
例如:

   

 3. 包含<Python.h>头文件调用相关函数调用

 1 #include <QCoreApplication>
 2 #include <Python.h>
 3 #include <QDebug>
 4 int main(int argc, char *argv[])
 5 {
 6     QCoreApplication app(argc, argv);
 7     wchar_t *program = Py_DecodeLocale(argv[0], nullptr);
 8     //设置 Python 解释器的程序名 这个程序名通常用于生成错误消息、警告和其他与程序标识相关的信息(可选)
 9     Py_SetProgramName(program);
10     //设置Python解释器的路径 (可选)
11     Py_SetPath(L"D:\\Python\\Python38_64;D:\\Python\\Python38_64\\DLLs;D:\\Python\\Python38_64\\lib");
12     // 初始化Python解释器
13     Py_Initialize();
14     // 导入Python模块
15     PyRun_SimpleString("import sys");
16     //因为一般是将对应的py文件放入运行目录因此需要添加当前的路径
17     PyRun_SimpleString("sys.path.append('./')");
18     //创建模块指针
19     PyObject *pModule = PyImport_ImportModule("python_script");
20     if(!pModule){
21         qInfo() << "pModule is nullptr!";
22         PyErr_Print();
23         exit(-1);
24     }
25     //获取函数
26     PyObject *pFunc = PyObject_GetAttrString(pModule, "greet");
27     if(!pFunc){
28         qInfo() << "pFunc is nullptr!";
29         PyErr_Print();
30         exit(-1);
31     }
32     //组装参数
33     PyObject *pPara = PyTuple_New(1);
34     PyTuple_SetItem(pPara,0,Py_BuildValue("s","HKK"));
35     //调用函数
36     PyObject* pValue = PyObject_CallObject(pFunc, pPara);
37     qInfo() << "res:" << PyUnicode_AsUTF8(pValue);
38     //调用Py_DECREF来减少Python 对象的引用计数,当引用计数为 0 时,对象被销毁防止内存泄漏
39     Py_DECREF(pValue);
40     Py_DECREF(pPara);
41     Py_DECREF(pFunc);
42     Py_DECREF(pModule);
43     // 结束Python解释器
44     Py_Finalize();
45     return app.exec();
46 }

4.运行结果:

 

需要注意的几点:

1. 编译时会报slots冲突,将python头文件中对应的slots名称修改一下例如修改为m_slots

2.编译通过运行失败,将对应的python动态库放入运行目录,例如我使用的是python38.dll

3.将对应的py文件放入运行目录

 

posted on 2024-07-08 17:56  Henkk  阅读(1)  评论(0编辑  收藏  举报