pyjsonrpcembd

(in english) http://www2s.biglobe.ne.jp/~niitsuma/pyjsonrpcembd.html

lispからpythonjson形式でデータを渡すインターフェイス. 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();
}

Makefile

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も同様。