のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

boost::python(1) classと関数の使用方法(PythonからC++の呼び出し)

Sponsored Links

皆さんこんにちわ。
お元気ですか?私は用心棒と呼ばれるラーメン屋にいって満足しました。元気です。

本日はboost::pythonのお話です。
boost::pythonとはC++クラスや関数をラップするPythonモジュールを簡単にかけるようなライブラリです。
Python.h を使ってC++で書いたコードをPythonで動かせるのですが、それを簡単にしたものと考えても大丈夫なのでしょうか。
(間違ってないか心配)

何回かに分けて、boost::pythonの使用方法を扱っていきたいと思います。
今回はSTLは扱わず、単純な型(int doubleなど)を扱います。STLは後日。

コンパイル

コンパイルコマンド

通常のboost::python(numpy.ndarrayとか渡さない)であれば、以下のコマンドで大丈夫です。

g++ -I`python -c 'from distutils.sysconfig import *; print get_python_inc()'` -DPIC -bundle -fPIC -o basic.so basic.cpp -lboost_python  -framework Python

念のためg++ --versionの結果も載せておきます。

Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin13.0.2
Thread model: posix

関数

C++ファイル

//basic.cpp
#include <boost/python.hpp>

int diff(int a, int b)
{
    return a - b;
}

BOOST_PYTHON_MODULE(basic)
{
    using namespace boost::python;
    def("diff", &diff);
}
注意点

①BOOST_PYTHON_MODULE()内とC++のファイル名が同じでないとPythonでエラーが出る。
→dynamic module does not define init function (initbasic)
②BOOST_PYTHON_MODULE()のdefに呼び出したい関数を書く。

Pythonでの実行

python
>>> import basic
>>> basic.diff(5,2)
3

class

C++ファイル

//basic_class.cpp
#include <boost/python.hpp>

class Foo{
public:
	int temp;
	void value(int a){
		temp = a;
	}
	int get_temp(){
		return temp;
	}

};

BOOST_PYTHON_MODULE(basic_class){
	using namespace boost::python;
	class_<Foo>("Foo")
	.def("value",&Foo::value)
	.def("get_temp",&Foo::get_temp);
}
注意点

①class_("Foo") ような形でクラスを指定する<>内がC++のclass,()内がPythonから呼び出したい名前。メンバ関数は普通の関数らしく指定。

Pythonでの実行

python
>>> import basic_class
>>> foo = basic_class.Foo()
>>> foo.value(2)
>>> foo.get_temp()
2

君のコードもBoostさせよう!。