Qt调用Python
1、安装anaconda
①、默认安装,安装后它自己会添加环境变量;
②、设置一个虚拟环境,名字为Python_3.9
conda create -n Python_3.9 python=3.9
注意联网,可以用anaconda安装后自带的cmd执行;环境最终被存放在了D:/Anaconda/envs/Python_3.9
2、配置Qt环境
①、为了方便协同开发,将上面normal文件夹复制到Third_party里
②、新建Qt工程,在pro里设置环境
INCLUDEPATH += $$(Third_Party)/Python_3.9/include LIBS += -L$$(Third_Party)/Python_3.9/libs -lpython39
3、新建python文件
mypython.py
def Myfun(info): print('call python file', info)
return "hhh"
4、调用python
#include "Python.h" //加入头文件 QString td = QProcessEnvironment:systemEnviroment().value("Third_Party");//获取系统环境变量 QString path = td+"/Python_3.9"; auto homePath = (wchar_t*)reinterpret_cast<const wchar_t*>(path.utf16()); Py_SetPythonHome(homePath); //将python路径加入python环境变量 Py_Initialize(); //初始化 if(!Py_IsInitialized()) //判断初始化是否成功 { //... } PyRun_SimpleString("import sys");//引入sys模块 PyRun_SimpleString("sys.path.append(\"./scpi_data\")");//将存放python文件的路径加入搜寻路径 PyObject* m_pyObj = PyImport_ImportModule("mypython");//将python文件导入成PyObject对象 QString inputPara = "this is paras"; auto ret = PyObject_CallMethod(m_pyObj, "Myfun", "s", inputPara.toStdString().c_str());//调用python中的Myfun函数,返回值是ret,s代表是字符串格式,如果是int则写i,double写d
char* retStr; PyArg_Parse(ret, "s", &retStr); qDebug()<<retStr;//"hhh" Py_Finalize();//结束
5、发布
将Python_3.9文件夹放到exe路径,并设置import path为此路径【QCoreApplication::curpath】,Python_3.9里存放:
注意:还需要将python3.dll和python39.dll与exe放一起
PS:
1、可以将m_pyObj 声明为类成员变量,方便整个生命周期使用
2、如果python文件里,某模块没有安装,可以联网下使用pip安装,然后将python环境里:/Lib/site-packetages新下载的两个文件夹复制到Third_Party
3、与PyObject_CallMethod类似的函数还有好几个
4、与PyArg_Parse类似的函数还有好几个,如python返回多个变量可用PyArg_ParseTuple
5、如果在python里打印了信息,在没有调用Py_Finalize前是不会打印的
6、打印异常
PyErr_Print();
长风破浪会有时,直挂云帆济沧海!
可通过下方链接找到博主
https://www.cnblogs.com/judes/p/10875138.html