Posted at

ubuntuでC++をpython3に公開する


初めに

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


使用方法

1.pythonに公開するC++のソースを作成します。今回はわかりやすくするため、クラスではなく文字列を返却する関数。


CModule.cpp

#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'