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文件放入运行目录
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本