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();

 

posted @ 2022-05-25 20:37  朱小勇  阅读(1832)  评论(0编辑  收藏  举报