我将尝试使用SWIG将C++库包装为Python库。该库经常使用回调函数,通过将某些类型的回调函数传递给类方法来实现。
现在,在包装代码之后,我想从Python中创建回调逻辑。这是否可能?以下是我进行的实验,目前无法正常工作。
头文件和SWIG文件如下: paska.h:
现在,在包装代码之后,我想从Python中创建回调逻辑。这是否可能?以下是我进行的实验,目前无法正常工作。
头文件和SWIG文件如下: paska.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);
paska.i :
%module paska
%{ // this section is copied in the front of the wrapper file
#define SWIG_FILE_WITH_INIT
#include "paska.h"
%}
// from now on, what are we going to wrap ..
%inline %{
// helper functions here
void wannabe_handleri(int i, char* blah) {
};
void handleri_eater(handleri* h) {
};
%}
%include "paska.h"
// in this case, we just put the actual .cpp code into the inline block ..
最后,我在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', argument 1 of type 'handleri *'"
有没有办法将Python函数转换为SWIG包装器接受的类型?
std::function
呢?这使得编写更清晰的答案变得更简单 - 如果您满意这个更改,我将为您编写完整的解决方案。(本质上是Python版本的https://dev59.com/Y1wY5IYBdhLWcg3waXO5#32668302,或者是https://dev59.com/9mbWa4cB1Zd3GeqPUDHZ#11522655的通用版本) - Flexovoid*
参数,你在注册它们时可以设置。这样会让生活更加简洁。 - Flexo