传递Python函数来对包裹的C++ COW进行扫描

2024-04-29 14:55:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用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包装器接受的类型?在


Tags: 方法函数类型thisswigintstprint
2条回答

您可以使用"directors"在Python中实现回调逻辑。在

基本上,不是传递回调函数,而是传递回调对象。基本对象可以在C++中定义,并提供^ {< CD1> }回调成员函数。然后可以从中继承该对象,并用Python重写回调函数。继承的对象可以传递给C++函数而不是回调函数。要实现这一点,您需要为此类回调类启用director功能。在

不过,这需要改变底层C++库。在

在我看来,^{}和SWIG ^{}的组合将是解决问题的最简单方法。ctypes使生成调用Python可调用的C函数变得容易。Python代码应该如下:

import example

# python callback
def py_callback(i, s):
    print( 'py_callback(%d, %s)'%(i, s) )

example.use_callback(py_callback)

在SWIG端,我们有:(1)一个Python函数use_callback,它用ctypes包装器包装Python回调,并将包装器的地址作为一个整数传递给_example.use_callback(),以及(2)一个SWIG typemap,它提取地址并将其强制转换到适当的函数指针。在

^{pr2}$

您可以在这个完整的示例中找到一个CMakeLists.txt文件文件here。在

编辑:合并@Flexo建议将Python部分移到SWIG文件的%pythoncode块中。在

编辑:incorporated@user87746关于python3.6+兼容性的建议。在

相关问题 更多 >