pybind11とは何ですか
pybind11
とは、C++で書かれたコードをPythonから簡単に呼び出せるようにするライブラリです。具体的には、C++関数・クラスをPythonにバインディング(橋渡し)するための軽量なヘッダオンリーライブラリです。
✅ 要点まとめ
項目 | 内容 |
---|---|
名称 | pybind11 |
用途 | C++コードをPythonから使えるようにする(バインディング) |
特徴 | ヘッダオンリー、軽量、C++11以降対応 |
主な代替 | Boost.Python、SWIG など |
主な用途 | Pythonから高速なC++シミュレータや計算ライブラリを使うときなど |
🧠 なぜ使うのか?
Pythonは書きやすいが遅い、C++は速いけど扱いにくい。
そのため、重い処理はC++で書き、インターフェースだけPythonで操作したいことがよくあります。
この「橋渡し」に pybind11
が使われます。
🔧 使用イメージ
C++側(example.cpp)
Python側
このように、C++の関数をまるでPythonで書いた関数のように使えるようになります。
🔚 まとめ
観点 | 内容 |
---|---|
概要 | C++とPythonをつなぐためのヘッダオンリーライブラリ |
主目的 | C++で書いた高速なロジックをPythonから呼び出す |
利点 | 軽量・高速・簡単・CMakeと相性良好 |
使用場面 | シミュレーション、機械学習、画像処理、ゲームエンジン等のバックエンド連携 |
必要であれば、あなたの railway_simulator
モジュールが pybind11 で作られているかどうかも確認する手順を案内できます。
使用イメージを実際に動かすにはどうすれば良いですか
以下に、pybind11
を使って C++ 関数を Python から呼び出せるようにする最小構成の実行手順をまとめます。
Linux / WSL / Mac / MSYS2 などの UNIX互換環境を前提にしています(Windows でも MSYS2 や WSL を使えば同じです)。
✅ ゴール
C++ の関数を Python から呼び出せるようにする:
↓ Pythonから:
🔧 準備
① Python と pybind11 のインストール
以下をターミナルで実行:
(C++コンパイラが必要です:gcc, clang, cl など)
📁 ② ファイルを作成
example.cpp
(C++側)
#include <pybind11/pybind11.h>
int add(int i, int j) {
return i + j;
}
PYBIND11_MODULE(example, m) {
m.def("add", &add, "A function which adds two numbers");
}
⚙️ ③ ビルド(共有ライブラリ作成)
以下のコマンドをそのままコピー&ペースト:
このコマンドは:
-
pybind11
のヘッダを含めて -
example.so
(もしくは.pyd
)というPython拡張モジュールを作成します
✅ ④ 実行(Pythonから呼び出し)
ターミナルで Python を起動し、次を試してください:
成功すれば pybind11 のバインディング成功です!
📎 注意点
項目 | 内容 |
---|---|
ビルドは1行で | 改行してしまうと command not found になります。1行にしてください |
Windows の場合 | -fPIC は不要/MSYS2環境を推奨します |
pybind11 の場所 | python3 -m pybind11 --includes により自動取得できます |
Python バージョン | python3.11 など環境によって異なる場合があります。必要なら python3-config を変更してください |
✅ もしうまくいかなかったら…
次の情報を貼ってもらえれば、個別にビルドコマンドを調整できます:
-
OS種別(Windows / Mac / Ubuntu / WSL など)
-
Pythonバージョン(
python3 --version
) -
コンパイラの種類(
gcc --version
など)
必要であれば、CMakeLists.txt
を使った構成や、.pyx
ファイルとの違い(Cython との比較)についてもご説明します。
c++ -O3 -Wall -shared -std=c++11 -fPIC \
python3 -m pybind11 --includes \
example.cpp -o examplepython3-config --extension-suffix
> > /home/ebata/.pyenv/versions/3.8.10/bin/python3: No module named pybind11
example.cpp:1:10: fatal error: pybind11/pybind11.h: No such file or directory
1 | #include <pybind11/pybind11.h>
| ^~~~~~~~~~~~~~~~~~~~~
compilation terminated.
と言われました
ありがとうございます。エラーメッセージを解析すると、以下の2つの問題が発生しています:
❌ 問題1:pybind11
がインストールされていない
これは pybind11
が Python環境に未インストールであることを示しています。
❌ 問題2:C++ヘッダファイル pybind11/pybind11.h
が見つからない
これは Python モジュールが見つからなかったため、--includes
で得られるインクルードパスも空になり、結果として pybind11.h
が見つからないという流れです。
✅ 解決手順
以下の手順に従って修正してください。
① pybind11 を正しい Python 環境にインストール
あなたは pyenv
を使って Python 3.8.10 を使っているようなので、次のコマンドを使います:
※または pyenv の環境をアクティベートしてから:
② 再度ビルドコマンドを実行
インストール後、以下の1行コマンドを再度実行してください:
(必要なら python3
を ~/.pyenv/versions/3.8.10/bin/python3
に書き換えてください)
✅ うまくいけば…
カレントディレクトリに example.cpython-38-x86_64-linux-gnu.so
のようなファイルができます。
Pythonで次のように実行できれば成功です:
📌 備考(トラブル防止)
内容 | 対処法 |
---|---|
複数バージョンの Python がある | 明示的に ~/.pyenv/versions/3.8.10/bin/python3 を使う |
pip install したのに ModuleNotFoundError |
pip と python が同じ環境を見ているか確認(例:which pip , which python3 ) |
pybind11 のヘッダが見つからない |
python3 -m pybind11 --includes の出力結果を確認して -I/path/to/pybind11/include を手動で追加 |