博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Qt中C++引用python文件和函数(联合编程)
阅读量:3961 次
发布时间:2019-05-24

本文共 2930 字,大约阅读时间需要 9 分钟。

文章内容

1.C++引用python文件环境配置

2.C++调用python文件和函数
3.C++获取python函数返回值
4.C++与python数据处理
引言:qt中C++和python联合编程以C++为主,C++调用python文件和函数

1.C++引用python文件环境配置

安装Qt和python,记录好python的安装位置,配置文件地址,编写程序的时候需要用到库文件

在Qt程序配置文件.pro中添加python外部库文件

INCLUDEPATH += D:/pycharm/Python/Python38/includeLIBS += -LD:/pycharm/Python/Python38/libs\        -l_tkinter\        -lpython3\        -lpython38

根据你自己python安装路径选择地址

2.C++调用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();

3.C++获取python函数返回值

C++文件

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

4.C++与python数据处理

C++调用python函数的时候,python文件只能有函数和一些常量值,变量是不会被分配内存的。在编写python接口程序的时候,需要分配内存多大变量需要在C++程序里面定义,然后通过接口传递给函数。

python使用的变量需要经过C++定义,再通过有参函数传递给python函数使用,将处理的结果返回给C++。C++定义的python变量是 PyObject* 类型,它是一个指针,将地址封装成元组作为参数传递给python函数,(python函数只接受tuple(元组)形式的参数)。python函数对C++传入参数做出的变动是直接通过传入的地址对存储的数据做出的改变。也就是说python操作的变量是C++定义的指针,直接对指针的内容做出改变。

转载地址:http://heezi.baihongyu.com/

你可能感兴趣的文章
测试Jsp 静态包含和动态包含
查看>>
简析几种常用的Web监听
查看>>
Web应用过滤器Fileter
查看>>
代理模式(Proxy)
查看>>
采用动态代理对事务进行封装
查看>>
Hibernate性能优化
查看>>
Spring核心ioc
查看>>
SSH框架总结(框架分析+环境搭建+实例源码下载)
查看>>
Struts2+Spring3+Mybatis3开发环境搭建
查看>>
mongoDB入门必读(概念与实战并重)
查看>>
通俗易懂解剖jbpm4
查看>>
rsync
查看>>
makefile
查看>>
linux 文件权限
查看>>
一些比较好的golang安全项目
查看>>
HTTP状态码
查看>>
go语言
查看>>
mysql mariaDB 以及存储引擎
查看>>
游戏行业了解介绍
查看>>
linux at 命令使用
查看>>