naoki86star

インターネットの片隅でなにかしら書いてみる

jython --- python on java eco-system

 clojureについて文法・言語形態の範囲を超えて、javaの生態系にのっかっていることを考えていた。そのときにそういえばjythonというjavaで動くpythonという実装を思い出した。
 前にちょっとさわろうとしたのだけども、あのときにはjavaの中からpythonスクリプトが呼び出せる、というところだけに目がいってpythonから既存javaクラスを呼ぶという発想にたどり着いていなかった。理解していなかった。HPの冒頭すぐにあるHere is an example of running Python code inside a simple Java applicationに意識が集中して、その下のHere is an example of using Java from Python codeの部分の潜在力を理解していなかったということ。

 今時点のjythonは、個人的感想としてさみしいというか、2.7系のpythonとしてあまり追い風が吹く状況でなく、いわゆるリリースもほとんどなされてない感じです。それでもつい最近にJython 2.7.2 beta (v2.7.2b3 February 2020)動きはあったみたいです。

 改めて、`pythonからjavaを呼び出す使い方`で一例試してみる。

nao@ $java -jar jython-standalone-2.7.2b3.jar
Jython 2.7.2b3 (v2.7.2b3:6d3659465010, Feb 2 2020, 11:27:28)
[Java HotSpot(TM) 64-Bit Server VM (Oracle Corporation)] on java1.8.0_151
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path.append('/opt/voltdb/voltdb/voltdbclient-7.8.1.jar')
>>> import org.voltdb.client.ClientConfig
>>> import org.voltdb.client.ClientFactory
>>> config = org.voltdb.client.ClientConfig()
>>> client = org.voltdb.client.ClientFactory.createClient(config)
>>> client.createConnection("voltdb1")
>>> res = client.callProcedure("@Statistics", [ "latency", 1])
>>> res.getResults()
array(org.voltdb.VoltTable, [ header size: 138
 status code: -128 column count: 13
 cols (TIMESTAMP:BIGINT), (HOST_ID:INTEGER), (HOSTNAME:STRING), (INTERVAL:INTEGER), (COUNT:INTEGER), (TPS:INTEGER), (P50:BIGINT), (P95:BIGINT), (P99:BIGINT), (P99.9:BIGINT), (P99.99:BIGINT), (P99.999:BIGINT), (MAX:BIGINT),
 rows -
  1582871858636,2,voltdb3,5000,41387,8277,524,14455,36767,50559,55199,55967,55967
  1582871858408,0,voltdb1,5000,46374,9274,547,11191,29823,45855,54687,58719,58719
  1582871858616,1,voltdb2,5000,38453,7690,531,10527,32479,58303,70271,70463,70463
])
>>>

sys.pathに使うjarを明示的に足すことでそのjarに含まれるclassのimportが可能になるとのこと。例外発生時とかコールバックを試してみてないけども、java.util.XXXとか全然importできてしまう*1

 jarに入っているclass のメソッドのテストとかが簡単にできそう。なにをテストしてるかの読みやすさな点ではclojureよりいい。テストデータの生成・加工するという点でもいいか。

 そういえば、IronPythonというものも思い出した。これについてはパワフルだと感じていた。ほとんど使うケースが起きえなかったのだけども .netがimportできるという部分には、畏敬の念(大げさ)を感じたような記憶あります。*2思い返すと、異なる言語をつないでいる構造が同じで、近視眼的かもしれないけどもようするに言語(フレームワーク?)のいいとこどり、の構造だったということ。
 ていうか、作られた方は同じみたい。respect him.

*1:一個python2.7.12でimportできるけどjythonでできない普通のxxx.py見つけた..特別なことはしていないのだけどもdict定義を一行に押し込めて長い1行を含むxxx.pyがimportできなかった...

*2:率直、あのときはxlsファイルをpythonから操作できる、という部分だけに注目してました。