python调用c++代码,python如何调用c+ +编写的代码
众所周知,Python具有开发效率高、易于使用的优点,而C运行效率高,两者可以互补。无论是在Python项目中嵌入C代码,还是在C项目中使用Python实现外围功能,都可能遇到Python调用C模块的需求。
下面是一些将集中式C代码导出到Python接口的方法。让我们一起学习。
原生态导出(推荐学习:Python视频教程)
Python解释器就是用C实现,因此只要我们的C++的数据结构能让Python认识,理论上就是可以被直接调用的。我们实现test1.cpp如下
#包含Python.h
int Add(int x,int y)
{
返回x y;
}
int Del(int x,int y)
{
返回x-y;
}
py object * wrap padd(py object * self,PyObject* args)
{
int x,y;
如果(!PyArg_ParseTuple(args, ii ,x,y))
{
返回NULL
}
返回Py_BuildValue(i ,Add(x,y));
}
py object * wrap pdel(py object * self,PyObject* args)
{
int x,y;
如果(!PyArg_ParseTuple(args, ii ,x,y))
{
返回NULL
}
返回Py_BuildValue(i ,Del(x,y));
}
静态PyMethodDef测试方法[]={
{Add ,WrappAdd,METH_VARARGS, something},
{Del ,WrappDel,METH_VARARGS, something},
{NULL,NULL}
};
外部 C
void inittest1()
{
Py_InitModule(test1 ,test _ methods);
}编译命令如下
g-fpic-shared test 1 . CPP-I/usr/include/python 2.7-otes t1 . so-fpic:生成与位置无关的目标代码,适用于动态连接;
-L path:表示在路径目录中搜索库文件,比如-L .表示在当前目录中;
-I path:表示在路径目录中搜索头文件;
-o file:将输出文件设置为file;
-shared:生成共享库文件;
运行Python解释器,测试如下
导入测试1
测试1。加法(1,2)
3这里要注意一下几点
如果生成的动态库的名字是test1,那么源文件中必须有函数inittest1,Py_InitModule的第一个参数必须是“test1”,否则Python导入模块会失败。
如果是cpp源文件,inittest1函数必须用extern C 修饰,但如果是C源文件,则不需要。原因是Python解释器在导入库的时候会寻找initxxx这样的函数,而C和C用不同的方式编码函数符号。c在编写函数符号时会考虑函数长度和参数类型。具体可以通过nm test1.so查看函数符号,C Filter工具可以通过符号逆向求解函数原型。
更多Python相关技术文章,请访问Python教程专栏学习!这就是python如何使用C代码的细节。更多信息请关注热门IT软件开发工作室其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。