1.14.2015

C++/Python: Diving Into Boost.Python

Boost.Python ことはじめ

 

Mac環境での動作を目指す。

インストール

Homebrew で簡単にインストールできる……

$ brew install boost

と、思ったら後の手順でリンクエラー。

$ g++ -I`python -c 'from distutils.sysconfig import *; print get_python_inc()'` \
-DPIC -bundle -fPIC -o hello.so hello.cpp -lboost_python -framework Python
ld: library not found for -lboost_python
clang: error: linker command failed with exit code 1 (use -v to see invocation)

boost-python というパッケージに分離していた模様。こちらもインストールする必要があった。

$ brew install boost-python

 

2015-01-18追記: Python3 に対応するためには、インストール時に以下のオプションを付けなければならない。

$ brew install boost-python --with-python3

 

2015-01-18追記2: pyenv を使っている場合は、global な Python を使用するように設定した状態でインストールしないとエラーになる。

$ pyenv global system
$ pyenv rehash
$ pyenv versions

 

コード例

boost のおかげで、とてもスッキリとしたコードになる。

#include <boost/python.hpp>
#include <iostream>

using namespace std;

void hello() {
  cout << "hello world" << endl;
}

BOOST_PYTHON_MODULE(hello) {
  using namespace boost::python;
  def("hello", &hello);
}

 

ビルド

hello.cpp から hello.so を作る。

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

 

動作確認

REPL で動かしてみる。

>>> import hello
>>> hello.hello()
hello world
>>>

本当に簡単だった。

 

References

0 件のコメント:

コメントを投稿