首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Python中将'managedbuffer‘转换为可调用的

如何在Python中将'managedbuffer‘转换为可调用的
EN

Stack Overflow用户
提问于 2018-06-07 22:39:37
回答 1查看 236关注 0票数 1

我已经使用SWIG为C++14库编写了一个Python包装器。在std::C++中,我可以将std::函数注册为回调函数。

我为std::function提供了一个SWIG类型映射来传递一个调用Python回调的lambda表达式:

代码语言:javascript
运行
复制
%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表达式运行良好:

代码语言:javascript
运行
复制
callback = lambda a,b: self.doStuff(a,b)
self.cppInterface.registerFunc(callback)

但是,此表达式不起作用:

代码语言:javascript
运行
复制
self.cppInterface.registerFunc(lambda a,b: self.doStuff)

当我将lambda直接传递给注册函数时,当从C++调用回调时,我得到了以下错误:

代码语言:javascript
运行
复制
TypeError: 'managedbuffer' object is not callable

为什么PyObject $input不是可调用的?如何同时允许这两个Python表达式?

示例代码:

https://github.com/nullmedium/python-swig-demo

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50744038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档