我有一个用swig包装的C文件。这个C文件包含一个带有函数指针作为参数的API(如下所示)。
example.c
int binary_op (int a, int b, int (*op)(int,int))
{
return (*op)(a,b);
}
我可以将函数映射到指针参数,前提是使用swig在同一文件中定义映射函数。但映射函数在另一个用Ctypes包装的C文件中定义。
testing.c
int add_int(int a, int b){
return a+b;
}
在Python中,我导入了swig生成的模块,并使用ctypes生成的映射函数调用了API,导致错误。
在testfile.py中
import example # Module generated by swig
from ctypes import *
wrap_dll = CDLL('testing.dll') # testing.dll is generated with File_2.c
# Mapping function 'add_int' to argument in 'binary_op'
example.binary_op(3,4,wrap_dll.add_int)
显示的错误是参数的类型不匹配。
TypeError: in method 'binary_op', argument 3 of type 'int (*)(int,int)'
答案 0 :(得分:0)
我在python中创建了一个类似ctypes的函数:
py_callback_type = CFUNCTYPE(c_void_p, c_int, c_int)
其中返回类型和参数类型类似于函数指针参数。现在我将映射函数'add'包装到上面的ctypes函数中。
f = py_callback_type(add)
最后我使用返回类型作为指针来转换包装函数,并且'.value'给出包装指针函数的地址。
f_ptr = cast(f, c_void_p).value
然后在swig接口文件中,使用类型图,我更改了指针参数,如下所示:
extern int binary_op (int a, int b, int INPUT);
现在,当我将函数映射到指针时,映射函数的地址将作为整数INPUT传递给binary_op函数。 由于参数是指针,因此将映射地址中的函数。
example.binary_op(4,5,f_ptr) ==> 9 //mapped function is 'add(int a, int b)' --> returns a+b