PyBind11 for c++

c++の高速性が必要でなおかつ、Pythonの書きやすさが必要な場合にはPythonからc++の処理の呼び出しが必要です。

いろいろな方法がありそうですが、PyBind11は2011年ごろに登場と比較的に新しく、それ故に機能も洗練されているだろうから動かしてみた。

ネットにも情報が多いから問題解決が難しくないだろうと思う。

<本家>

https://pybind11.readthedocs.io/en/stable/index.html#

“pybind11 is a lightweight header-only library that exposes C++ types in Python and vice versa,”

とあるようにpythonからc++も呼べるし、逆もまた可なりのヘッダーファイルライブラリにすぎないと。

<install>

$ pip3 install pybind11

—Installed path—

/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/pybind11/include/pybind11

<sample program & compile>

https://qiita.com/takuyakubo/items/b7503d7555bbc6c44aba

このリンク先にある、以下のclangコンパイルで作成できた。本家のドキュメントと全く同じですが。

% clang++ -O3 -Wall -shared -std=c++17 -fPIC `python -m pybind11 –includes` -undefined dynamic_lookup py_call.cpp -o example`python3-config –extension-suffix`

『コンパイラオプションは、最適化(-O3)、共有ライブラリとしてビルド(-shared -fPIC)、言語標準の指定(-std=c+17)、インクルードディレクトリの追加( `python3 -m pybind11 –includes`)、コンパイル対象(py_call.cpp)、出力(cpplcm`python3-config –extension-suffix`)となります』

https://buildersbox.corp-sansan.com/entry/2019/12/09/110000

の説明から引用。

<sample code : py_call.cpp>

PYBIND11_MODULE以下がマクロで、pybind11で解釈されます。

m.def()中の”add”はPythonから呼び出される時の関数名で、&addはint add()関数がそれに相当すると定義しています。

#include <pybind11/pybind11.h>

int add(int i, int j) {

  return i + j;

}

PYBIND11_MODULE(example, m) {

  m.doc() = "pybind11 example plugin";                          // optional module docstring

  m.def("add", &add, "A function which adds two numbers");

}


<call from python>

コマンドラインで実行して、import exampleが実行できればモジュールが作成できています。

% python

Python 3.10.3 (v3.10.3:a342a49189, Mar 16 2022, 09:34:18) [Clang 13.0.0 (clang-1300.0.29.30)] on darwin

Type "help", "copyright", "credits" or "license" for more information.

>>> import example

>>> example.__doc__

'pybind11 example plugin'

>>> example.add(24, 43)

67

作成されるのは、共有ライブラリファイルで、”example.cpython-310-darwin.so“がPythonから呼び出されるファイルになります。MacOSなのでこんな名前になります。Pythonも実装はcだから、インターフェースは出来て当たり前ということでしょう。

-rwxr-xr-x   1 hogehoge  staff  148016  4 28 10:07 example.cpython-310-darwin.so

このケースは一番単純な機能確認ですが、実際には配列などを引数にするときにはc++とPython間で何らかの変換が必要になるでしょう。

 

admin