seraphyの日記

日記というよりは過去を振り返るときのための単なる備忘録

JDK6のScriptingでjythonを呼び出してみる(その2)

Scriptingはとくに進展なし。

ScriptEngineのScriptContextまたはBindingsにJavaのオブジェクトを渡すとスクリプトの中で利用することが可能であり、その逆も可能。
なので、異なるスクリプトエンジンでScriptContextで定義されたオブジェクトを利用するためには、とりあえず、JAVAオブジェクトだと思わせておけば確実にできそうな気がする。
(めんどくさく、回りくどいが、他に方法もないような気もする。)
ということでテスト。


JavaScript上でRunnableを実装したオブジェクトを作成し、それをpythonで実行。

    public static void main(String[] args) throws Exception {
        final ScriptEngineManager engMgr = new ScriptEngineManager();
        final ScriptEngine eng1 = engMgr.getEngineByName("javascript");
        eng1.eval("obj = new java.lang.Runnable() { run: function() { print('hello, world!');}}");
        
        final ScriptEngine eng2 = engMgr.getEngineByName("python");
        eng2.setContext(eng1.getContext());
        eng2.eval("obj.run()");
        
        final Runnable job = (Runnable) eng1.get("obj");
        job.run();
    }

出来て当たり前。


逆パターン。
pythonでRunnableを実装したオブジェクトを作成し、JavaScriptで実行。

    public static void main(String[] args) throws Exception {
        final ScriptEngineManager engMgr = new ScriptEngineManager();
        final ScriptEngine eng1 = engMgr.getEngineByName("python");
        final StringBuilder scr = new StringBuilder();
        scr.append("from java.lang import Runnable\n");
        scr.append("class MyClass(Runnable):\n");
        scr.append("\tdef run(self):\n");
        scr.append("\t\tprint 'hello, world 2!'\n");
        scr.append("obj = MyClass()\n");
        eng1.eval(scr.toString());
        
        final ScriptEngine eng2 = engMgr.getEngineByName("ecmascript");
        eng2.setContext(eng1.getContext());
        eng2.eval("obj.run();");

        final Runnable job = (Runnable) eng1.get("obj");
        job.run();
    }

これも出来て当たり前。


ひねりが足りず知性も感じられない気がするが、とりあえず動いたので良しとする。


今日の成果。

といった、基本的な使いかたを試すことができたので満足とする。