python使用ctypes与C混合编程

python作为胶水,可以非常方便地和其他语言进行混合编程,当然和C混合编程的方式也有很多种,如使用Cyptes、Cython、Boost、Swig等等。使用混合编程的好处在于可以理由各个语言优势,完成整个功能,如c语言的效率就明显高于python语言。Ctypes的方式,主要流程是将c源代码通过编译生成动态链接库dll或so文件,然后在python中使用ctypes动态链接库导入功能。
调用方式示例
#目前支持的dll方式也有多重如PyDLL\CDLL\OleDLL\WinDLL等;
from ctypes import *
exampledll = CDLL('example.dll')
exampledll.func.restype = c_bool #设置ctypes模块中对应的类型
exampledll.func.argtypes = [type1, ...] #设置ctypes模块中对应的类型
exampledll.func()
数据类型对应关系
cyptes模块的基本的类型格式与c语言的数据类型对应关系如下,这些基础类型都可以进行初始化,如c_int(0)。而指针数据类型,修改时,改变了它们指向的地址位置,而非原来地址中修改相应值。
指针传递方式可以使用pointer和byref,在python中无需使用pointer对象时建议使用byref函数。当C和python之间传递结构体和联合类型时,需要从ctypes中的Structure和Union继承得来,需要定义_fields_属性,该属性为二元组(名,type)的方式,亦即_fields_ = [ ("name1",type1), (name2,type2), ...],其中的类型定义为ctypes模块中的类型,结构体中支持嵌套结构体的复杂方式。cytpes中可以采用class _pack_(int)方式来实现c中的地址对齐方式。当定义结构体比特域时,可以在_fields_属性中采用三元组方式(“name”, type, 比特数)。数组定义的推荐方式 类型*个数。指针pointer的使用,var = type(value) , pointervalue = pointer(var);pinter的contents属性可以得到指向的类型及其值。sizeof可以查看占用存储空间大小,而resize()可以用来重新定义变量大小。ctypes中的Array具有_length_及_type_属性。
指定函数参数及返回值类型
返回值的表示方式函数.restype = cytpes.类型;函数参数的表示方式函数.argtypes = [cytpes.类型,...] 然后进行函数调用或者直接类似类型强转方式使用函数func(ctypes.类型(),...)。

猜你喜欢

转载自blog.csdn.net/dreambitbybit/article/details/80588071