c++编写python库,python语言能够集成C,C++等语言编写的代码

  c++编写python库,python语言能够集成C,C++等语言编写的代码

  一、我们都知道python这门语言是有c语言编写而成的,那么今天就用c语言编写一个python模块,python在底层运算中会对每个运算做类型检查, 这就影响了运行的性能,而利用扩展, 可以避免这样的情况, 获得优越的执行性能,利用Python提供的C API,如宏,类型,函数等来编写扩展。二、环境准备

  Centos7.4Python 2.7.5gcc版本4.8.5 20150623(红帽4.8.5-36) (GCC)说明:需要确保环境中已经安装了python-dev包三、以下已判断一个数是否为质数为例,py.c:

  # includes dio . h # includes python 2.7/python . h//有很多# includes pythons . h//判断是否是素数静态py object * pr _ is prime(py object * self,pyobject * args) {int n,num//解析参数if(!PyArg_ParseTuple(args, I ,num)){ return NULL;} if(num 1){ return Py _ build value( I ,0);//C类型成python对象} n=num-1;while (n 1) { if (num % n==0)返回Py_BuildValue(i ,0);n-;}返回Py_BuildValue(i ,1);}静态pymethoddef pr methods[]={//方法名,导出函数,参数传递方法,方法描述。{isPrime ,pr_isprime,METH_VARARGS,检查输入数是否为质数},{NULL,NULL,0,NULL } }void initpr(void){(void)Py _ init module( pr ,pr methods);}上面的代码包含3个部分:

  导出函数:C模块暴露的接口函数是pr_isprime,有两个参数,self和args。args包含了python解释器想要传递给C函数的所有参数,通常使用PyArg_ParseTuple()来获取这些参数值。初始化函数:python解释器一次就能正确初始化模块,初始化要从init开始,比如initp。方法列表:对外提供的python程序使用函数名映射表PrMethods,是一个PyMethodDef结构,其成员依次为方法名、导出函数、参数传递方法和方法描述。

  PyMethodDef原型:struct PyMethodDef { char * ml _ name;#方法名PyCFunction ml _ meth#导出函数int ml _ flags#参数传递方法char * ml _ doc#方法描述}四、setup.py脚本

  #!/usr/curly hair/env python # coding=UTF-8从distutils.core导入setup,extension module=extension (pr ,sources=[ py . c ])setup(name= pr test ,Version= 1.0 ,ext _ modules=[module])用python setup.py build编译,系统会在当前目录下产生一个构建目录,里面包含pr.so和pr.o文件。五、安装模块

  可以使用以下三种方法中的任何一种:

  将生成的pr.so复制到python的site_packages目录下(我的是/usr/local/lib/python 2.7/dist-packages,但是放在site_packages里不行)。或者将pr.so路径添加到sys.path中.或者使用python setup.py install让python完成安装过程。或者gcc-I/usr/include/python 2.7/-fpic-shared-opr . sopr . c(一起编译安装)

  我用python setup.py install安装在这里。

  我们可以看到Pr-test出现在pip列表中,这是我们刚刚安装的模块。

  如果想进一步学习,还是要看官方文件。

  参考文章

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

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