Chinaunix首页 | 论坛 | 博客
  • 博客访问: 491842
  • 博文数量: 140
  • 博客积分: 461
  • 博客等级: 下士
  • 技术积分: 878
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-28 10:06
文章分类

全部博文(140)

文章存档

2016年(1)

2015年(6)

2014年(20)

2013年(1)

2012年(16)

2011年(96)

分类: Python/Ruby

2014-07-12 21:37:18

篇外话:前一阵子一直没倒出功夫整理、发布博客,趁这两天整理一下,发出来做个记录

   本文只讲Python C API,不对Python ctypes进行介绍

由于项目需要,对c语言接口进行了python绑定,采用Python C API方式

接口绑定代码中首先需要引入头文件。C函数总是有两个参数,按照惯例分别为selfargs。由于定义的是个函数而不是方法,所以self总是为NULLargs参数是一个指向Pythontyple对象的指针,包含参数。每个tuple自相对应一个调用参数,这些参数也全都是Python对象,所以需要先转换成C值。函数PyArg_ParseTyple()检查参数类型并转换成C值。它使用模板字符串检测需要的参数类型。PyArg_ParseTyple()正常返回非零,并按照提供的地址存入了各个变量值。如果出错则返回NULL

把函数声明为可以被Python调用,需要先定义一个方法表,如:

static PyMethodDef XXXMethods[]={

……

{ (char *)”someFunc”, someFunc, METH_VARARGS, NULL}

……

{ NULL, NULL, 0,NULL,}

}

单独使用第三个参数METH_VARARGS,函数会等待Python传来tuple格式的参数,并最终使用PyArg_ParseTuple()进行解析。

方法表必须传递给模块初始化函数。初始化函数的函数命名规则为initname(),其中name为模块名:

void initNAME()

{

    Py_InitModule((char *)”NAME”, XXXMethods);

}

Python程序首次导入这个模块时就会调用initNAME()函数,其中调用Py_InitModule()来创建一个对象。

将该文件编译成动态库之后,在python代码中导入该库,即可使用NAME方法。

在C文件中的另一个要素即为类型转换相关的函数,首先对传入参数进行解析,形成C接口的参数,最后将函数返回值转化成PyObject格式之后返回。


题外话:最后不得不吐槽一下CU博客的编辑功能,操作真的不够顺手

阅读(1848) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~