1

私の人生では、pybind11 で構築された拡張モジュールで動作する非常に基本的な Python コールバック関数を取得することはできません。ここの例に従おうとしていますが、何か誤解していると思います。

C++ コードは次のとおりです。

#include <iostream>
#include <functional>
#include <pybind11/pybind11.h>

namespace py = pybind11;

void run_test(const std::function<int(int)>& f)
{
   // Call python function?
   int r = f(5);
   std::cout << "result: " << r << std::endl;
}

PYBIND11_PLUGIN(mymodule)
{
    py::module m("mymodule");
    m.def("run_test", &run_test);
    return m.ptr();
} 

そして、このモジュールを使用する Python コードは

import mymodule as mm

# Test function
def test(x):
  return 2*x

mm.run_test(test)

ただし、次のエラーが表示されます。

Traceback (most recent call last):
  File "test.py", line 7, in <module>
    mm.run_test(test)
TypeError: run_test(): incompatible function arguments. The following argument types are supported:
    1. (arg0: std::function<int (int)>) -> None

Invoked with: <function test at 0x2b506b282c80>

関数のシグネチャが一致するとは思わないのはなぜですか? 例を一致させようとしましたが、何か誤解しているに違いないと思います...

4

2 に答える 2