python与C++混合编程.docx

上传人:b****5 文档编号:7923035 上传时间:2023-01-27 格式:DOCX 页数:11 大小:1.22MB
下载 相关 举报
python与C++混合编程.docx_第1页
第1页 / 共11页
python与C++混合编程.docx_第2页
第2页 / 共11页
python与C++混合编程.docx_第3页
第3页 / 共11页
python与C++混合编程.docx_第4页
第4页 / 共11页
python与C++混合编程.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

python与C++混合编程.docx

《python与C++混合编程.docx》由会员分享,可在线阅读,更多相关《python与C++混合编程.docx(11页珍藏版)》请在冰豆网上搜索。

python与C++混合编程.docx

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

 

网上资料:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1