通过Ctypes来给C语言传递回调函数
C语言中有些函数需要制定一些回调函数,在调用函数时需要传递函数指针过去。
函数指针类型创建的方法如下
CFUNCTYPE(返回值类型,参数类型...)
下面是一个示例
CMPFUNC = CFUNCTYPE(c_int,c_int,POINTER(c_int))
def py_cmp_func(a,b):
print("py_cmp_func",a,b)
return 0
cmp_func = CMPFUNC(py_cmp_func)
我们通过ctypes传递回调函数给C库函数qsort进行快速排序(windows平台)
void qsort(void base, size_t nitems,size_t size, int(compar)(const void,const void))
testctypesqsort.py
print("Test Ctypees qsort function callback")
from ctypes import *
lib = cdll.msvcrt
# 快速排序比较函数
CMPFUNC = CFUNCTYPE(c_int, POINTER(c_int),POINTER(c_int))
# 比较函数判断大小
def cmp_callback(a, b):
# a 指向c_int
return a.contents.value - b.contents.value
cmpfunc = CMPFUNC(cmp_callback)
qsort = lib.qsort
# 排序的数据 整型列表
data = (c_int * 5)(5, 1, 7, 33, 99)
for i in data:
print(i ,end = " ")
print("\n开始排序")
qsort(data, len(data), sizeof(c_int), cmpfunc)
for i in data:
print(i ,end = " ")
运行结果如下
Test Ctypees qsort function callback
5 1 7 33 99
开始排序
1 5 7 33 99