您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > python与C++混合编程
普通方式一、环境搭建1.安装python2.6(python3.xx版本编译失败,未找到原因)。2.配置vs2008项目(python自带的python26.dll为release版本,所以vs2008项目也必须调整为release,但是通过设置也可以对release进行调试,如果需要debug版本可以从网上下载已有的python26_d.dll和python26_d.lib,也可以下载python源码自己编译。)①C/C++----常规---附件库包含目录,加入python头文件目录,如下图:②连接器---常规---附件库目录。加入python库文件目录,如下图:③连接器---输入---附加依赖项。加入python库文件名,如下图:二、代码实现1.C++调用python①高层次嵌入python(所谓的高层次嵌入主要是指程序与脚本间没有交互)#includePython.hintmain(){Py_Initialize();/*Python解释器初始化*/PyRun_SimpleString(print'hi,python!');/*运行python字符串*/Py_Finalize();/*结束Python解释器,释放资源*/return0;}②低层次嵌入pyton,可以交互。但是只限python的基本类型数据(整型、浮点型、字符串、元组、列表和字典)。C++代码:#includestdio.h#includePython.hintmain(intargc,char*argv[]){PyObject*modulename,*module,*dic,*func,*args,*rel,*list;char*funcname1=sum;inti;Py_ssize_ts;printf(-==在C中嵌入Python==-\n);/*Python解释器的初始化*/Py_Initialize();if(!Py_IsInitialized()){printf(初始化失败!);return-1;}/*导入Python模块,并检验是否正确导入*/modulename=Py_BuildValue(s,pytest);/*pytest参数,为python脚本,此处的意思是导入当前路径下名称为pytest.py的python脚本文件*/module=PyImport_Import(modulename);if(!module){printf(导入pytest失败!);return-1;}/*获得模块中函数并检验其有效性*/dic=PyModule_GetDict(module);if(!dic){printf(错误!\n);return-1;}/*获得sum函数地址并验证*/func=PyDict_GetItemString(dic,funcname1);if(!PyCallable_Check(func)){printf(不能找到函数%s,funcname1);return-1;}/*构建列表*/list=PyList_New(5);printf(使用Python中的sum函数求解下列数之和\n);for(i=0;i5;i++){printf(%d\t,i);PyList_SetItem(list,i,Py_BuildValue(i,i));}printf(\n);/*构建sum函数的参数元组*/args=PyTuple_New(1);PyTuple_SetItem(args,0,list);/*调用sum函数*/PyObject_CallObject(func,args);/*释放资源*/Py_DECREF(list);Py_DECREF(args);Py_DECREF(module);/*结束Python解释器*/Py_Finalize();printf(按回车键退出程序:\n);getchar();return0;}Python代码,pytest.py文件内容。importmath#导入python自带math库,可用于简单的数学计算defsum(p1):#定义sum函数count=len(p1)sum=0foriinrange(count):#求数组中所有元素的和sum+=p1[i]print(sum)2.Python调用C++(使用python中的ctypes模块可以很方便的调用windows的dll(也包括linux下的so等文件))fromctypesimport*dll=CDLL(add.dll)printdll.Add(1,102)结果:103利用boost库中的,boost.python方式一、环境搭建1.下载boost库,自己编译,或者从网上下载已编译好的boost库。2.配置vs2008项目④C/C++----常规---附件库包含目录,加入boost头文件目录,如下图:⑤连接器---常规---附件库目录。加入boost库文件目录,如下图:⑥连接器---输入---附加依赖项。加入boost.python库文件名,如下图:二、代码实现1.C++调用python(利用boos.Python实现C++调用python,实现数据结构(如基本类型,字符串,整数类型等,以及自定义的类等类型)间的转换)构造一个c++的对象,传入到python中,并在python的脚本中调用其函数C++代码:#includeboost/python.hpp#includeiostreamusingnamespaceboost::python;classWorld{public:voidset(std::stringmsg){this-msg=msg;}std::stringgreet(){returnmsg;}std::stringmsg;};typedefboost::shared_ptrWorldworld_ptr;BOOST_PYTHON_MODULE(hello){class_World(World).def(greet,&World::greet).def(set,&World::set);register_ptr_to_pythonworld_ptr();}intmain(intargc,char*argv[]){Py_Initialize();world_ptrworldObjectPtr(newWorld);worldObjectPtr-set(HellofromC++!);try{inithello();PyRun_SimpleString(importhello);objectmodule(handle(borrowed(PyImport_AddModule(__main__))));objectdictionary=module.attr(__dict__);dictionary[pyWorldObjectPtr]=worldObjectPtr;PyRun_SimpleString(pyWorldObjectPtr.set('HellofromPython!'));}catch(error_already_set){PyErr_Print();}std::coutworldObjectPtr-greet():worldObjectPtr-greet()std::endl;Py_Finalize();return0;}2.Python调用C++C++代码:charconst*greet(){returnhello,world;}#includeboost/python.hppusingnamespaceboost::python;BOOST_PYTHON_MODULE(hello){def(greet,greet);}Python代码:importhelloprinthello.greet()hello,world利用普通方式对C++进行python的嵌入,实现将一个二维数组传入python脚本,计算所有数据的和,并返回其结果。(可以实现多维数组的传入,类似dmatrix矩阵)C++代码:#includeQtCore#includeQtGui#includePython.hintmain(intargc,char*argv[]){QApplicationa(argc,argv);PyObject*modulename,*module,*dic,*func,*args,*list;char*funcname1=sum;printf(-==在C中嵌入Python==-\n);/*Python解释器的初始化*/Py_Initialize();if(!Py_IsInitialized()){printf(初始化失败!);return-1;}/*导入Python模块,并检验是否正确导入*/modulename=Py_BuildValue(s,functionText);module=PyImport_Import(modulename);if(!module){printf(导入pytest失败!);return-1;}/*获得模块中函数并检验其有效性*/dic=PyModule_GetDict(module);if(!dic){printf(错误!\n);return-1;}/*获得sum函数地址并验证*/func=PyDict_GetItemString(dic,funcname1);if(!PyCallable_Check(func)){printf(不能找到函数%s,funcname1);return-1;}printf(使用Python中的sum函数求解二维数组所有元素之和\n);/*构建两行四列的二维数组12345678*/list=Py_BuildValue((iiii)(iiii),1,2,3,4,5,6,7,8);/*构建sum函数的参数元组*/args=PyTuple_New(1);PyTuple_SetItem(args,0,list);/*调用sum函数*/PyObject*rempResult=PyObject_CallObject(func,args);longrel=PyInt_AsLong(rempResult);//求和printf(调用sum函数返回值:%d\n,rel);/*释放资源*/Py_DECREF(list);Py_DECREF(args);Py_DECREF(module);/*结束Python解释器*/Py_Finalize();printf(按回车键退出程序:\n);getchar();return0;returna.exec();}Python代码:importnumpyasnpdefsum(p1):rows=len(p1)columns=len(p1[0])sum=0foriinrange(rows):forjinrange(columns):sum+=p1[i][j]returnsum网上资料:://blog.csdn.net/whisperLin/article/category/523784
本文标题:python与C++混合编程
链接地址:https://www.777doc.com/doc-4991956 .html