niitsuma blog このページをアンテナに追加 RSSフィード

2008-02-09 python関係

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

参考

in english http://niitsuma.blogspot.com/2009/01/lisp-python-interface-via-json.html

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/niitsuma/20080209/1233260146