pybind11 で main モジュール上に関数を定義するには、pybind11::module::def
関数を使います。 次の例では、C++ で定義した hello
関数を Python スクリプトから呼び出しています。
sample.cpp
#include <pybind11/embed.h>
#include <pybind11/pybind11.h>
namespace py = pybind11;
void hello()
{
printf("Hello, world!\n");
}
int main()
{
// python インタプリタを起動する
py::scoped_interpreter interpreter;
// main モジュール上に hello 関数を定義する
py::module main_module = py::module::import("__main__");
main_module.def("hello", &hello);
// python スクリプトから hello 関数を呼び出す
py::object scope = main_module.attr("__dict__");
py::exec("hello()", scope);
return 0;
}
$ # M1 Mac (Ventura) + Python 3.9.6 + pybind11 2.10.3 (Homebrew)
$ clang sample.cpp -std=c++20 -lc++ -lpython3.9 -rpath /Library/Developer/CommandLineTools/Library/Frameworks -I/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.9/Headers -I/opt/homebrew/Cellar/pybind11/2.10.3/include -L/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.9/lib -o sample
$ ./sample
Hello, world!
scoped_interpreter
の使い方と、必要なヘッダファイルの詳細は pybind11 で C++ から Python インタプリタを実行する を参照してください。
参考資料
-
pybind11 で C++ から Python インタプリタを実行する
https://yokaze.github.io/2018/02/11/ -
Functions — pybind11 documentation
http://pybind11.readthedocs.io/en/stable/advanced/functions.html