C++言語

pybind11でPython関数からC++のインスタンスを返す方法

はじめに

本記事は「pybind11でPython関数の引数にC++のインスタンスを渡す方法」の続きです。
環境構築や Makefile などは、上記記事をご覧ください。

こちらもCHECK

pybind11でPython関数の引数にC++のインスタンスを渡す方法

AIの分野では、Pythonでアルゴリズム検討を行うケースが増えており、最近C++とPythonを繋げるためのライブラリpybind11が注目されています。本記事ではC++で定義したクラスのインスタンスを引数に、Pythonの関数を呼び出す方法を紹介します。

続きを見る

 

ここでは、Python 関数の戻り値C++で実装したクラスとして返す方法を紹介します。

SANACHAN
SANACHAN
pybind11を使っています。

 

C++側のコード

C++ 側で Python 側から受け取るためのクラス AnalyzeData を定義します。
Python 側でも使えるように PyAnalyzeData というクラスを C++ 側から Python 側へ実装します。

ポイント

C++ 側で Python 側のクラスを実装する場合は、PYBIND11_EMBEDDED_MODULE を使います。



前回と異なる点は、Python のクラスを実装する際の def __init__(self) 相当を実装していることです。
pybind11 で実装する .def(py::init<>()) が Python の def __init__(self) 相当になります。

 

また、Python からの戻り値はクラスインスタンスの実体になります。
クラスのポインターではないことに注意してキャスト・使用してください。

 

Python 側のコード

Python 側では、C++ で実装した Python のモジュール、クラスを使用して戻り値を生成します。

 

PyAnalyzeData というモジュールとして C++ 側で実装しましたので、
先ずは import でモジュールを読込みます。

その後、そのモジュールの PyAnalyzeData クラスのインスタンスを生成し、
プロパティに値をセットして return します。

 

おわりに

いかがでしたでしょうか。

今回は、Python 側から クラスインスタンスを戻り値として返し、C++ 側で受け取る方法を紹介しました。
前回の内容と合わせると、双方向でクラスインスタンスをやり取りすることができるようになりますので、
pybind11 を使って Python と C++ を繋げて実現できる幅が広がったのではないでしょうか。

 

こちらの記事もよく読まれています

  • この記事を書いた人
  • 最新記事
SANACHAN

SANACHAN

「生涯一エンジニア」を掲げ、大手グローバル企業でSE/PGとして8年勤め、キャリアアップ転職した現役のエンジニアです。世にあるメジャーな全プログラム言語(コボル除く)を自由に扱えます。一児の父。自分のため、家族のため、日々勉強してます。システムエンジニア、プログラミングに関する情報を蓄積している雑記帳です。

-C++言語
-, , , ,