COLUMN
組み込みエンジニアの戸惑い PythonからC言語を呼び出してみる③(SWIGを使った場合)
組み込みソフトウェアエンジニアがPythonを始めてみました。そして、第7の戸惑い、前回、前々回に引き続き組み込みとは切っても切り離せない「C言語」に関しての話題の最終回です。これまでPythonからC言語を呼び出す方法についてご紹介してきましたが、今回はC++に限定した呼び出し方法となります。前回ご紹介したSWIGよりもさらに簡単な手順で扱えてしまうboost.pythonの使い方や簡単な仕組みなどをご紹介していきたいと思います。
boost .python
boost.pythonはC++を使っているとお世話になることも多い「boost C++ ライブラリ」の一部です。C++で書かれたコードとPythonのコードを繋ぐインターフェースとなるフレームワークであり、今回ご紹介するPythonからC++を呼び出すことのほかに、その逆も可能とするライブラリです。使用する際に特別なツールなどのインストールは必要なく、C++のコンパイラだけで実現できてしまいます。
他のC言語/C++を呼び出す方法との違いは?
C++の内容に合わせた簡単なラッパーを用意するだけ。Python/C APIを使用する際に作成するラッパーや、SWIGを使う時に作成するインターフェースファイルよりも簡単に記述ができ、面倒くさい+αのルールを覚える必要もない。C++だけで考えるとPython/C APIやSWIGよりも効率的にPythonで使用することができます。
仕組み
boost.pythonを使用して、ビルドから実行までの流れを確認しておきましょう。
まず初めに、元となるC++のファイル(.cpp)に合わせてラッパー(.cpp)を作成します。次に、元となるC++のファイル(.cpp)と、ラッパー(.cpp)をビルドします。ビルドして出来上がった共有ライブラリファイル(.so)はC++を呼び出したいPythonのコード上でインポートし、対象となる関数を呼ぶだけの簡単すぎる使い方です。
C++ファイルの例
Pythonから呼び出したいC++のファイルを作成します。
what.cpp
#include <boost/python.hpp>
char const doYouDo( const char* jobs ){
return “Hello, I am an embedded engineer.”;
}
ラッパーの例
C++ファイルに合わせたラッパーを作成します。
what.cpp のつづき
#include <boost/python.hpp>
BOOST_PYTHON_MODULE( what ){
boost::python::def( ” doYouDo “, doYouDo);
}
ビルドする
作成したC++ファイルをビルドします。
g++ -fPIC -Wall -lboost_python -shared -o whatModule.so what.cpp
Pythonから呼び出す
準備は整ったので、最後にPythonから作成したC++を呼び出してみましょう。
>>> import what
>>> what.doYouDo( )
Hello, I am an embedded engineer.
前々回ご紹介したPython/C API (Python.h)よりも、前回ご紹介したSWIGよりもかなり簡単に呼び出すことができています。もう少しboost.pythonを理解する必要がある気がしてきませんか?ご興味がある方はboost.pythonのサイト(https://www.boost.org/doc/libs/1_72_0/libs/python/doc/html/index.html)をご覧ください。
次回以降は実際に評価ボードを使用して、Pythonを、そして組み込みのあれこれをご紹介できたらと考えておりますので、引き続きどうぞよろしくお願いいたします。
個別相談も承っております。下記よりお申し込みください。