【问题标题】:Pybind callback function generationPybind回调函数生成
【发布时间】:2022-08-16 16:50:45
【问题描述】:

我正在为 C++ 函数编写 Python 绑定代码:

void cls::acceptCall(My::namespace::Reply reply)
{
    std::cout <<__FUNCTION__ << std::endl;
    reply(My::namespace::Result::Ok, nullptr);
}
using Reply = std::function<void(Result result, std::exception_ptr error)>;
enum class Result {Ok,NOT_OK }

绑定代码:

py::class_<APIExtProvider>(m, \"APIExtProvider\")
    .def(\"acceptCall\", &APIExtProvider::acceptCall, py::call_guard<py::gil_scoped_release>())

python_调用:

result = pyunifiedphone.Result.OK
exception = pyunifiedphone.Exception()

def reply_method(result, exception):
    return None
     
 provider.acceptCall(reply_method)

但是,我收到此错误:

TypeError:acceptCall():不兼容的函数参数。支持以下参数类型: 1. (self: pyunifiedphone.APIExtProvider, arg1: Callable[[pyunifiedphone.Result, pyunifiedphone.Exception], None]) -> 无

调用:<pyunifiedphone.APIExtProvider object at 0x7f2b6aa149b0>, , <function reply_method at 0x7f2b6abfa1f0>

正确的绑定方法是什么?

    标签: python c++ python-3.x c++14 pybind11


    【解决方案1】:

    不幸的是 pybind11 不会自动将数据类型从 c/c++ 转换为 python 。 将此头文件添加到您的项目并再次测试。如果它不起作用,您应该将数据转换为可绑定类型。

    #include <pybind11/functional.h>
    #include <pybind11/chrono.h>
    #include <pybind11/stl.h>
    #include <pybind11/complex.h>
    

    【讨论】:

      猜你喜欢
      • 2018-03-05
      • 1970-01-01
      • 2011-08-07
      • 1970-01-01
      • 2013-04-29
      • 2020-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多