チラシの裏は意外と白くない

最近忘れっぽくなったので調べたことをチラシの裏に書きます

pythonからC++を呼び出して、jsonファイルをやり取りする②

前回、C++で書いた関数をpythonモジュールにして、それをpythonから呼び出すプロトタイプを作成した。続いて、jsonファイルをやり取りする方法を検討する。C++向けのjsonパーサとしてはjansson,picojson等いろいろあるのだが、janssonが直感的でAPIリファレンスがしっかりしているらしいので、これを使ってみることにする。

環境構築

janssonの公式ページ?を参考にインストールを行う。 jansson.readthedocs.io

janssonのmake

以下のサイトから最新のtarballをゲット。今回利用したのは2.13。

digip.org

今回、いろいろな事情で環境側(/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を呼ぶことを想定している。

まとめ

  • janssonのインストールを行った
  • setup.pyでインクルードパスとライブラリパスを指定する方法を調査した
  • 次はpythonとのAPI部とは切りはなして、janssonの詳細を見ていく