hmEdgeJSとhmPython3を混ぜて使う

hm**の言語シリーズは混ぜて使うことが出来ます。

原則的にどの組み合わせでも混ぜて利用することが可能ですが、
ここではGithubコミットで「スクリプト言語ではトップ2」となる
ECMAScriptとPythonを組み合わせるという意味で、

  • nodeライブラリが利用出来るhmEdgeJS
  • ネイティブなpythonライブラリが利用出来るhmPython3

を考えてみましょう。

この2つの組み合わせは、普通なら「アウトプロセスならまだしもインプロセスで連携するのはなかなか難しい」
と言える組み合わせの1つと言えるでしょう。

混ぜてみた例

ES6にもPython3にも両方ともJSONを取り扱うライブラリが存在しますので、 ES6のJSON.stringifyやpythonのjson.loadを使うことで、
「hmEdgeJS⇔秀丸マクロ変数」「秀丸マクロ変数⇔python3」が簡単であるため、
JSONを介在にして、ECMAScriptのオブジェクトを簡単にpythonへと伝達することが出来ます。

  • 秀丸マクロ側のソース

    hmEdgeJSとhmPython3を両方実行する。

    mytest.mac
    #NODE = loaddll( hidemarudir + @"\hmEdgeJS.dll");
    
    #r = dllfuncw( #NODE, "DoFile", currentmacrodirectory + @"\mynodetest.js" );
    
    freedll(#NODE);
    
    
    #V8 = loaddll( hidemarudir + @"\hmPython3.dll" );
    
    #r = dllfuncw( #V8, "DoString", "import myhmpython3test" );
    
    freedll( #V8 );
    
  • hmEdgeJS用のjs側のソース

    mynodetest.js
    let mydata = {
        arr: [ 1,2,3 ],
        file: __filename // __filenameという変数はnodejs独特のもの
    };
    
    let myDataJSON = JSON.stringify(mydata);
    
    console.log(myDataJSON);
    
    // このJSONデータを秀丸マクロの変数として格納しておく
    hm.Macro.Var["$Transaction_JSON"] = myDataJSON;
    
  • hmPython3用のpy側のソース

    myhmpython3test.py
    from hmPython import hm
    import json;
    
    
    # 秀丸マクロの変数にあるJSONを引き出して…
    myDataJSON = hm.Macro.Var["$Transaction_JSON"];
    
    # Pythonのdictとして解釈する
    mydata = json.loads(myDataJSON);
    arr = str(mydata["arr"]);
    fi = str(mydata["file"]);
    
    hm.debuginfo(arr);
    hm.debuginfo(fi);