我试图用SWIG包装Python的C++库。库经常使用回调函数,方法是将特定类型的回调函数传递给类方法。在
现在,在包装代码之后,我想从python创建回调逻辑。这可能吗?这是我做的一个实验来找出答案。。目前不起作用。在
头文件和swig文件如下:
帕斯卡·h:
typedef void (handleri)(int code, char* codename);
// handleri is now an alias to a function that eats int, string and returns void
void wannabe_handleri(int i, char* blah);
void handleri_eater(handleri* h);
帕斯卡。i:
^{pr2}$最后,我用python进行测试。。在
import paska
def testfunc(i, st):
print i
print st
paska.handleri_eater(paska.wannabe_handleri(1,"eee")) # THIS WORKS!
paska.handleri_eater(testfunc) # THIS DOES NOT WORK!
最后一行抛出“TypeError:in method'handleri_eater”,类型为“handleri*”的参数1
有没有办法将python函数“强制转换”为SWIG包装器接受的类型?在
您可以使用"directors"在Python中实现回调逻辑。在
基本上,不是传递回调函数,而是传递回调对象。基本对象可以在C++中定义,并提供^ {< CD1> }回调成员函数。然后可以从中继承该对象,并用Python重写回调函数。继承的对象可以传递给C++函数而不是回调函数。要实现这一点,您需要为此类回调类启用director功能。在
不过,这需要改变底层C++库。在
在我看来,^{} 和SWIG ^{} 的组合将是解决问题的最简单方法。
ctypes
使生成调用Python可调用的C函数变得容易。Python代码应该如下:在SWIG端,我们有:(1)一个Python函数
^{pr2}$use_callback
,它用ctypes
包装器包装Python回调,并将包装器的地址作为一个整数传递给_example.use_callback()
,以及(2)一个SWIGtypemap
,它提取地址并将其强制转换到适当的函数指针。在您可以在这个完整的示例中找到一个CMakeLists.txt文件文件here。在
编辑:合并@Flexo建议将Python部分移到SWIG文件的%pythoncode块中。在
编辑:incorporated@user87746关于python3.6+兼容性的建议。在
相关问题 更多 >
编程相关推荐