2017-07-11 44 views
-1

我有一个用swig包装的C文件。这个C文件包含一个带有函数指针作为参数的API(如下所示)。ctypes和swig for python之间的互操作性

example.c

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

我可以映射到指针参数的函数提供的映射函数在同一文件中使用痛饮定义。但映射函数是在另一个用Ctypes包装的C文件中定义的。

testing.c

int add_int(int a, int b){ 
    return a+b; 
} 

在Python,我输入痛饮生成模块和被称为API与ctypes的生成的映射函数,它导致错误。

在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

我们有一个错误,没有代码,也没有问题。 [mcve]三分之一,请尽量做得更好。 – Anthon

+0

在这里搜索回调,SWIG和Python,你会发现你可以使用的东西。它在那里 –

+0

@JensMunk:我已经搜索了很多,但没有任何关系。任何帮助将不胜感激,如果你能指导我相关的东西。谢谢 –

回答

0

我已经用Python创建了一个ctypes功能象下面这样:

py_callback_type = CFUNCTYPE(c_void_p, c_int, c_int) 

在返回类型和参数类型类似于函数指针参数。现在我将映射函数'add'包装到上面的ctypes函数中。

f = py_callback_type(add) 

最后,我用铸造返回类型为指针和“.value的”包装的函数给出包裹指针函数的地址。当我的功能映射到指针

extern int binary_op (int a, int b, int INPUT);

现在,映射的地址:

f_ptr = cast(f, c_void_p).value 

然后在痛饮接口文件,使用typemaps,我已经改变了指针参数如下函数将作为整数INPUT传递给binary_op函数。 由于参数是一个指针,地址中的函数将被映射。

example.binary_op(4,5,f_ptr) ==> 9 //mapped function is 'add(int a, int b)' --> returns a+b