如何使用 pybind11 将 python 函数转换为 std::function

Posted

技术标签:

【中文标题】如何使用 pybind11 将 python 函数转换为 std::function【英文标题】:How to cast a python function to std::function with pybind11 【发布时间】:2017-11-08 17:49:40 【问题描述】:

我有一个c++ 类型Foo,其中包含一个std::function<void()> funcs,它已成功绑定到python。我的目标是在 python 中定义函数并将它们添加到这种类型,然后返回一个实例。在 c++ 中,我使用 pybind 来获取这种类型的实例。但是,当我尝试调用其中一个函数时,我的程序会出现段错误。

class Foo

    void addFunc(std::function<void()> _func)
    
      funcs.push_back(_func);
    

    void call(int _index)
    
      funcs[_index]();
    

private:
    std::vector<std::function<void()>> funcs;


namespace py = pybind11;

PYBIND11_MODULE(foo, m) 

    py::class_<Foo>(m, "foo")
        .def(py::init<int, int>())
        .def("addFunc", &Foo::addFunc)
        .def("call", &Foo::call);

后来在 c++ 中

py::scoped_interpreter python;
auto module = py::module::import("foo_module");
auto func = module.attr("create_foo");
auto result = func();
//This works!
result.attr("call")(0);
Foo* blah = result.cast<Foo*>();
//This seg-faults!
blah->call(0);

我的 python 模块有这个:

def newFunc():
    print "working!"

def create_foo():

  temp = foo.Foo(0, 100)
  temp.addFunc(newFunc)
  return temp

我不确定为什么函数没有正确地转换回 c++?

【问题讨论】:

【参考方案1】:

我不得不将py::scoped_interpreter python; 移动到更高的范围,因为调用函数时它不在范围内

【讨论】:

以上是关于如何使用 pybind11 将 python 函数转换为 std::function的主要内容,如果未能解决你的问题,请参考以下文章

如何将浮点数传递给期望 int 的 pybind11 函数

python嵌入C++,函数返回shared_ptr(pybind11/boost_python)

pybind11 解释器使用捆绑的 python 可执行文件

使用pybind11开发python扩展库

Pybind11:将字符串*参数传递给构造函数

基于pybind11为C++提供Python接口