Python から Java を使ってみる

Python から Java を弄りたいと思ったので何となくやってみる。
PyPI でモジュールを探したら javabridge と javaclass がでてきた。

javaclass

で、 javaclass を試してみたらダメだったという。

Mercurial のリポジトリ(証明書エラー出るので自己責任) に runclass.py というサンプルがあるので中を見てみると、

import javaclass.classhook
import java.lang

となっている。

これは javaclass.classhook を読み込んだ時点で Python の import hook が仕掛けられるのだろうけども、どうやらこれがうまくいっていない。

調べるのも面倒なのでこっちはスルー。

javabridge

もう一つのモジュール javabridge を使ってみる。

$ pip install javabridge

してみたらこけた。
JAVA_HOME がないっぽかったので jdk 落としてきて

$ JAVA_HOME=$HOME/local/jdk1.7.0_05 pip install javabridge

とか指定してあげた。
でもだめ。

gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions build/temp.linux-i686-2.6/javabridge/javabridge.o -L/home/shoma/local/jdk1.7.0_05/jre/lib/amd64/server -ljvm -o build/lib.linux-i686-2.6/javabridge/javabridge.so

/usr/bin/ld: cannot find -ljvm

collect2: ld returned 1 exit status

とか言われてしまう。
このメッセージをよく見ると、

-L/home/shoma/local/jdk1.7.0_05/jre/lib/amd64/server

とか書いてあっておかしい。
そもそもこのビルドを行っているマシンは 32bit OS なのでこんな指定は変だなあと。

まあ直接指定すればいいので

$ export CFLAGS="-L/home/shoma/local/jdk1.7.0_05/jre/lib/i386/server"

とか指定してあげて再度ビルドしてインストール成功。

使ってみる

とりあえず普通に import すればいいようなので

from java import lang

lang.System.out.println("Hello, Java")

とかやってあげたら動いた。
良かったね。

これで Python から Java のリフレクション実験しまくれるね。
Java 書いて実験するっていう選択肢は Java がかったるいので存在しません。
Jython でもいいんだけどね。