python与C++混合编程.docx
- 文档编号:16260459
- 上传时间:2023-07-12
- 格式:DOCX
- 页数:12
- 大小:1.22MB
python与C++混合编程.docx
《python与C++混合编程.docx》由会员分享,可在线阅读,更多相关《python与C++混合编程.docx(12页珍藏版)》请在冰点文库上搜索。
python与C++混合编程
普通方式
1、环境搭建
1.安装python2.6(python3.xx版本编译失败,未找到原因)。
2.配置vs2008项目(python自带的python26.dll为release版本,所以vs2008项目也必须调整为release,但是通过设置也可以对release进行调试,如果需要debug版本可以从网上下载已有的python26_d.dll和python26_d.lib,也可以下载python源码自己编译。
)
1 C/C++---->常规--->附件库包含目录,加入python头文件目录,如下图:
2 连接器--->常规--->附件库目录。
加入python库文件目录,如下图:
3 连接器--->输入--->附加依赖项。
加入python库文件名,如下图:
2、代码实现
1.C++调用python
1 高层次嵌入python(所谓的高层次嵌入主要是指程序与脚本间没有交互)
#include
intmain()
{
Py_Initialize();/*Python解释器初始化*/
PyRun_SimpleString("print'hi,python!
'");/*运行python字符串*/
Py_Finalize();/*结束Python解释器,释放资源*/
return0;
}
2 低层次嵌入pyton,可以交互。
但是只限python的基本类型数据(整型、浮点型、字符串、元组、列表和字典)。
C++代码:
#include
#include
intmain(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;i<5;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=0
foriinrange(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、环境搭建
1.下载boost库,自己编译,或者从网上下载已编译好的boost库。
2.配置vs2008项目
4 C/C++---->常规--->附件库包含目录,加入boost头文件目录,如下图:
5 连接器--->常规--->附件库目录。
加入boost库文件目录,如下图:
6 连接器--->输入--->附加依赖项。
加入boost.python库文件名,如下图:
2、代码实现
1.C++调用python(利用boos.Python实现C++调用python,实现数据结构(如基本类型,字符串,整数类型等,以及自定义的类等类型)间的转换)
构造一个c++的对象,传入到python中,并在python的脚本中调用其函数
C++代码:
#include
#include
usingnamespaceboost:
:
python;
classWorld
{
public:
voidset(std:
:
stringmsg){this->msg=msg;}
std:
:
stringgreet(){returnmsg;}
std:
:
stringmsg;
};
typedefboost:
:
shared_ptr
BOOST_PYTHON_MODULE(hello)
{
class_
.def("greet",&World:
:
greet)
.def("set",&World:
:
set)
;
register_ptr_to_python
}
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:
:
cout<<"worldObjectPtr->greet():
"< : endl; Py_Finalize(); return0; } 2.Python调用C++ C++代码: charconst*greet() {return"hello,world"; } #include usingnamespace boost: : python; BOOST_PYTHON_MODULE(hello) {def("greet",greet); } Python代码: >>>importhello >>>printhello.greet() hello,world 利用普通方式对C++进行python的嵌入,实现将一个二维数组传入python脚本,计算所有数据的和,并返回其结果。 (可以实现多维数组的传入,类似dmatrix矩阵) C++代码: #include #include #include intmain(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"); /*构建两行四列的二维数组 1234 5678 */ 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代码: importnumpyasnp defsum(p1): rows=len(p1) columns=len(p1[0]) sum=0 foriinrange(rows): forjinrange(columns): sum+=p1[i][j] returnsum 网上资料:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- python C+ 混合 编程