python调用c++代码,python如何调用c+ +编写的代码

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: