我有一个用Swig包装的C文件。这个C文件包含一个以函数指针作为参数的API(如下所示)。

example.c

int binary_op (int a, int b, int (*op)(int,int))
{
    return (*op)(a,b);
}


我可以将函数映射到指针参数,只要使用swig在同一文件中定义了映射函数。但是映射函数是在另一个用Ctypes包装的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)'

最佳答案

我已经在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接口文件中,使用typemaps,如下更改了指针参数:

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

关于python - python的ctypes和swig之间的互操作性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45032972/

10-16 07:36