python与C++混合编程.docx
《python与C++混合编程.docx》由会员分享,可在线阅读,更多相关《python与C++混合编程.docx(11页珍藏版)》请在冰豆网上搜索。
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_ptrworld_ptr;
BOOST_PYTHON_MODULE(hello)
{
class_("World")
.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():
"<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
网上资料: