pythonからC++を呼び出して、jsonファイルをやり取りする②
前回、C++で書いた関数をpythonモジュールにして、それをpythonから呼び出すプロトタイプを作成した。続いて、jsonファイルをやり取りする方法を検討する。C++向けのjsonパーサとしてはjansson,picojson等いろいろあるのだが、janssonが直感的でAPIリファレンスがしっかりしているらしいので、これを使ってみることにする。
環境構築
janssonの公式ページ?を参考にインストールを行う。 jansson.readthedocs.io
janssonのmake
以下のサイトから最新のtarballをゲット。今回利用したのは2.13。
今回、いろいろな事情で環境側(/usr/include, /usr/lib)に組み込めない想定のコンパイル環境を構築する必要があるため、--prefixでローカルのディレクトリを指定。ちなみにmake checkをするとテストコードのmakeルールが定義されていないとか何とかでエラーするが、とりあえず使えているので気にしないことにしておく。。
$ tar zxvf jansson-2.13.tar.gz $ cd jansson-2.13 $ ./configure --prefix $PROJ_ROOT_PATH/lib/jansson $ make $ make install
上記で、$PROJ_ROOT_PATH/lib/jansson以下にincludeとlibができる。
setup.pyの変更
janssonをローカルのディレクトリに展開したため、コンパイルオプションを追加する必要がある。makefileで#
- -I$PROJ_ROOT_PATH/lib/jansson/include
- -L$PROJ_ROOT_PATH/lib/jansson/lib
- -ljansson
に相当するものを、setup.pyに追加する。 調べたところ、次のように書けばよいらしい:
setup( name = 'my_arith', version = '1.0.0', ext_modules = [ Extension( 'my_arith',['core.cpp'], include_dirs=[os.environ['PROJ_ROOT_PATH']+'/lib/jansson/include'], # 追加 library_dirs=[os.environ['PROJ_ROOT_PATH']+'/lib/jansson/lib'], # 追加 libraries=['jansson'] # 追加 )], )
なお、$PROJ_ROOT_PATHはあらかじめ環境変数にセットした状態で、setup.pyを呼ぶことを想定している。