我已经使用SWIG为C++14库编写了一个Python包装器。在std::C++中,我可以将std::函数注册为回调函数。
我为std::function提供了一个SWIG类型映射来传递一个调用Python回调的lambda表达式:
%typemap(in) std::function {
auto callback = [$input](auto&&... params) {
PyGILState_STATE state = PyGILState_Ensure();
PyObject* result = PyObject_CallFunctionObjArgs($input,makePyObject(std::forward<decltype(params)>(params))..., NULL);
const int retVal = PyObject_IsTrue(result);
Py_DECREF(result);
PyGILState_Release(state);
return retVal == 1;
};
$1 = std::move(callback);
}当我运行一个测试脚本时,以下Python表达式运行良好:
callback = lambda a,b: self.doStuff(a,b)
self.cppInterface.registerFunc(callback)但是,此表达式不起作用:
self.cppInterface.registerFunc(lambda a,b: self.doStuff)当我将lambda直接传递给注册函数时,当从C++调用回调时,我得到了以下错误:
TypeError: 'managedbuffer' object is not callable为什么PyObject $input不是可调用的?如何同时允许这两个Python表达式?
示例代码:
https://stackoverflow.com/questions/50744038
复制相似问题