皆さんこんにちわ。
お元気ですか?私は用心棒と呼ばれるラーメン屋にいって満足しました。元気です。
本日は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); }
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); }
Pythonでの実行
python >>> import basic_class >>> foo = basic_class.Foo() >>> foo.value(2) >>> foo.get_temp() 2
君のコードもBoostさせよう!。