python から jar を使いたい
JNIだとCPython使わないとならないみたいなので、
py4j とかいうのがよさげ。
別プロセスでjavaを起動してソケット通信でpythonとブリッジする的なやつ。
kuromoji
と自作のjarで試してみた。
っていうか、pythonからkuromoji
が使えると嬉しかったので、いろいろ試してみた結果。
準備
- py4jの中から
py4j0.8.2.1.jar
を取り出して用意しておく -
kuromoji-0.7.7.jar
を用意しておく
コード
まず自作のやつ
org/kuryu/Sample.java
package org.kuryu;
public class Sample {
public String foo() {
return "FOO!!!!!!!!";
}
public static String bar() {
return "BAR!!!!!!!!";
}
}
jarにする
$ javac org/kuryu/Sample.java
$ jar cvf kuryu.jar org/kuryu/*.class
py4jのjava側のコード
J4Py.java
import py4j.GatewayServer;
public class J4Py {
public static void main(String[] args) {
J4Py app = new J4Py();
GatewayServer server = new GatewayServer(app);
server.start();
}
}
manifestに自作のjarとkuromojiも加えておく。
manifest.mf
Main-Class: J4Py
Class-Path: py4j0.8.2.1.jar kuromoji-0.7.7.jar kuryu.jar
jarにする
$ javac -cp py4j0.8.2.1.jar J4Py.java
$ jar cvfm J4Py.jar manifest.mf J4Py.class
GatewayServerの起動
classpath通して起動すれば、py4j側からも使えるらしい。
jarで起動する場合
$ java -jar J4Py.jar
classで起動する場合
$ java -cp py4j0.8.2.1.jar:kuromoji-0.7.7.jar:kuryu.jar:. J4Py
py4jのpython側のコード
javaのGatewayServerを起動した状態で、こう。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from py4j.java_gateway import JavaGateway
gateway = JavaGateway()
# java.util.Random
random = gateway.jvm.java.util.Random()
n1 = random.nextInt(10)
n2 = random.nextInt(10)
print "%d + %d = %d" % (n1, n2, n1+n2)
# 自作のjar
kuryu = gateway.jvm.org.kuryu.Sample
print kuryu.bar()
ins = kuryu()
print ins
print ins.foo()
# kuromoji の Tokenizer
KuroTokenizer = gateway.jvm.org.atilika.kuromoji.Tokenizer
tokenizer = KuroTokenizer.builder().build();
a = tokenizer.tokenize(u"寿司が食べたい。")
for token in a:
print token.getSurfaceForm() + "\t" + token.getAllFeatures()
参考にしたとこ
主にこのへん。
http://www.atilika.com/ja/products/kuromoji.html
http://py4j.sourceforge.net/py4j_java_gateway.html
http://qiita.com/mojaie/items/f16b97b1388f73e56b86