初めに
C++のソースをpython3で使用するためにboostpythonをインストールしました。
一般的な方法だとboostを公式サイトからダウンロードして使用するみたいですが、pythonとC++の共有以外のboostは特に必要ないため楽な方法がないか探してaptインストールを見つけました。
環境
- Ubuntu:18.04.2
- python3:3.6.8
必要ライブラリのインストール
1.最初にaptのインストールリポジトリを最新にします。
apt update
2.ubuntuのバージョンによっては既にインストールされているため、不要ですが今回はなかったのでpython3をインストールします。
apt install python3
3.boostpythonに必要なため、pythonとC++の共通ライブラリをインストールします。
apt install build-essential python3-dev
4.今回の目玉であるboostpythonをインストールする
apt install libboost-dev
@additengineer さんのコメントで以下のコマンドを追加。
ライブラリのインストール可能なバージョンや環境によってはmake時に-lのライブラリパスがない旨のエラーがでます。その際は、以下を入れてください。
apt install libboost-all-dev
使用方法
1.pythonに公開するC++のソースを作成します。今回はわかりやすくするため、クラスではなく文字列を返却する関数。
#include <boost/python.hpp>
std::string hello() {
return "hello world";
}
BOOST_PYTHON_MODULE(CModule) {
using namespace boost::python;
def("hello", &hello);
}
2.C++のコンパイルのために必要なので、boostpythonの内部で使用するpythonとC++の共有ライブラリのパスを調べます。※python2とpython3が共存している環境ではpython3側を明示的に指定すること
python3 -c 'from distutils.sysconfig import *; print(get_python_inc())'
3.コンパイルは、簡単にするため今回はmakeファイルを使用せずにg++でコンパイルをします。
g++ -I 2で調べたインクルードパス -DPIC -shared -fPIC -o アウトプットモジュール名 1で作成したC++ファイル -lboost_python3
g++ -I/usr/include/python3.6m -DPIC -shared -fPIC -o CModule.so CModule.cpp -lboost_python3
4.pythonから呼び出す
公開したC++の設定どおりにpython側から該当関数を呼び出す。
>>> import CModule
>>> CModule.hello()
'hello world'