本文共 2930 字,大约阅读时间需要 9 分钟。
1.C++引用python文件环境配置 2.C++调用python文件和函数 3.C++获取python函数返回值 4.C++与python数据处理
引言:qt中C++和python联合编程以C++为主,C++调用python文件和函数安装Qt和python,记录好python的安装位置,配置文件地址,编写程序的时候需要用到库文件
在Qt程序配置文件.pro中添加python外部库文件INCLUDEPATH += D:/pycharm/Python/Python38/includeLIBS += -LD:/pycharm/Python/Python38/libs\ -l_tkinter\ -lpython3\ -lpython38
根据你自己python安装路径选择地址
Py_Initialize(); //初始化python库文件 PyRun_SimpleString("import sys"); //引用库函数 PyRun_SimpleString("sys.path.append('./')"); //把当前目录设为当前路径添加python文件 //python文件与debug/realse文件在同一路径,但是不要把python文件放在此程序debug/realse文件内,否则会出现没有找到python文件的错误,还有一种可能是python文件语法错误也会找不到python文件 PyObject* pModule = NULL, *first = NULL, *second = NULL; //声明python指针对象 pModule = PyImport_ImportModule("test_py1"); //调用python文件 if (!pModule) { printf("Cant open python file!\n"); return ; } //无参调用 second = PyObject_GetAttrString(pModule,"show"); //声明需要调用的函数 PyEval_CallObject(second,NULL); //开始调用函数 //有参函数调用 //PyObject * pDict = PyModule_GetDict(pModule); first = PyObject_GetAttrString(pModule,"add_item"); PyObject *pArgs = NULL, *pList = NULL; //构造列表 pList = PyList_New(2); PyList_SetItem(pList,0,Py_BuildValue("s","x_name")); //Py_BuildValue将C++数据转化为python数据 PyList_SetItem(pList,1,Py_BuildValue("s","y_name")); //将数值插入列表 PyList_Append(pList,Py_BuildValue("s","the third")); //构造字典 PyObject *pDict = PyDict_New(); PyDict_SetItemString(pDict,"first",Py_BuildValue("i",1)); PyDict_SetItemString(pDict,"second",Py_BuildValue("i",1)); //设置参数,用元组封装 pArgs = PyTuple_New(2); PyTuple_SetItem(pArgs,0,pList); PyTuple_SetItem(pArgs,1,pDict); PyEval_CallObject(first,pArgs); //调用first有参数函数 Py_Finalize();
PyObject* pModule = PyImport_ImportModule("pytest");PyObject* pFunhello = PyObject_GetAttrString(pModule,"py_test");PyObject* pArg = NULL; char* ch; QByteArray ba = filename.toLatin1(); ch = ba.data(); //Qstring转成char类型 pArg = Py_BuildValue("(s)",ch); //一个字符串参数 PyObject* pyValue = PyObject_CallObject(pFunhello,pArg); char *strA,*IO_door; PyArg_ParseTuple(pyValue,"s|s",&strA,&IO_door);//只返回一个数时会显示乱码,所以加了没有含义的IO_door if(pyValue) { QString get_pyStr=QString::fromUtf8(strA); }
pytest.py文件
def py_test(str) xx = str +'abc' return xx
C++调用python函数的时候,python文件只能有函数和一些常量值,变量是不会被分配内存的。在编写python接口程序的时候,需要分配内存多大变量需要在C++程序里面定义,然后通过接口传递给函数。
python使用的变量需要经过C++定义,再通过有参函数传递给python函数使用,将处理的结果返回给C++。C++定义的python变量是 PyObject* 类型,它是一个指针,将地址封装成元组作为参数传递给python函数,(python函数只接受tuple(元组)形式的参数)。python函数对C++传入参数做出的变动是直接通过传入的地址对存储的数据做出的改变。也就是说python操作的变量是C++定义的指针,直接对指针的内容做出改变。
转载地址:http://heezi.baihongyu.com/