pyjsonrpcembd
(in english) http://www2s.biglobe.ne.jp/~niitsuma/pyjsonrpcembd.html
lispからpythonへjson形式でデータを渡すインターフェイス. pythononlispがpython.numpyに対してうまく動いてくれなかったため作成した。embedding経由でつながってるのでポインターも渡せるはず。なので単純なjsonと違って巨大配列も渡せるはず。
clispで動作を確認
sbclでは何故かnumpyの呼び出しができない
単純なcのshardlibなのでcommon lisp以外からも呼べると思う.
Install
wget http://www2s.biglobe.ne.jp/~niitsuma/pyjsonrpcembd03.tar.gz
tar zxf pyjsonrpcembd03.tar.gz
cd pyjsonrpcembd
make
sudo make install
使い方
usr/lib/python2.5/site-package/pyjsonrpcembd/pyjsonrpcregister.pyを編集してexportしたい関数をregisterする
def echo( s ): print s return s server.register_function( echo )
のようにregisterしていく。詳しくは下のpyjsonrpcregister.pyの例を参照。その後
(pyjsonrpchandle "{\"jsonrpc\": \"2.0\", \"method\": \"echo\", \"params\": [[\"hoge\"]], \"id\": 0}"))
のように呼び出す
より詳しい使い方
/usr/lib/python2.5/site-package/pyjsonrpcembd/pyjsonrpcregister.py
を編集して呼出したい命令を以下のように記述して登録する
import pyjsonrpcembd server = pyjsonrpcembd.jsonrpc.Server( pyjsonrpcembd.jsonrpc.JsonRpc20(), pyjsonrpcembd.jsonrpc.TransportSTDINOUT()) def echo( s ): print s return s server.register_function( echo ) import numpy server.register_function( numpy.linalg.norm )
登録したらtestディレクトリに入った例を参考に呼び出す。以下はtestに入ってるファイルの解説。c,common lisp,gaucheからpythonを呼ぶ例がある。
common lisp からの呼び方
(asdf:oos 'asdf:load-op :cffi) (require :cffi) (cffi::define-foreign-library libjsonrpcembd (:unix "libjsonrpcembd.so") (:windows "libjsonrpcembd.dll")) (cffi::load-foreign-library 'libjsonrpcembd) (cffi::defcfun ("pyjsonrpcinit" pyjsonrpcinit) :void ) (cffi::defcfun ("pyjsonrpcfinalize" pyjsonrpcfinalize) :void ) (cffi::defcfun ("pyjsonrpchandle" pyjsonrpchandle) :string (jsonstr :string) ) ( pyjsonrpcinit) ;ここまで初期化 ;ここで呼び出す (print (pyjsonrpchandle "{\"jsonrpc\": \"2.0\", \"method\": \"norm\", \"params\": [[2, 3]], \"id\": 0}")) ;後始末 (pyjsonrpcfinalize)
出力
{"jsonrpc": "2.0", "result": 3.60555127546, "id": 0}
Cからの呼び方
#include <stdio.h> const char *pyjsonrpchandle(const char *jsonstr); void pyjsonrpcinit(); main() { pyjsonrpcinit(); printf( pyjsonrpchandle("{\"jsonrpc\": \"2.0\", \"method\": \"norm\", \"params\": [[2, 3]], \"id\": 0}")); Py_Finalize(); }
lltest:calltest.c libjsonrpcembd.so cc calltest.c \ -I/usr/include/python2.5 -lpython2.5 -lboost_python -L. -ljsonrpcembd -Wall
gaucheからのpythonの呼び方
(use c-wrapper) (c-load-library "libpyjsonrpcembd.so") (c-include "pyjsonrpcembd.h") (c-load-library "libc") (c-include "stdio.h") (pyjsonrpcembedinit) (printf ( pyjsonrpcembedhandle "{\"jsonrpc\": \"2.0\", \"method\": \"norm\", \"params\": [[2, 3]], \"id\": 0}" )) (pyjsonrpcembedfinalize)
etc
このプログラムはこれらの議論からの影響も受けている
http://groups.google.co.jp/group/comp.lang.lisp/browse_thread/thread/36f57b7b281e5a94?pli=1
http://groups.google.co.jp/group/comp.lang.lisp/browse_thread/thread/7b12144dc7967575?pli=1
多くのCで書かれたpythonのプログラムはclpython http://common-lisp.net/project/clpython/
では動かない。numpyも同様。