Jythonの簡単なTips

Jythonの配列の扱い
 配列を引数としてとるJavaメソッドに、 Pythonのリストやたっぷるをそのまま渡そうとしてもうまくいきません。 PythonのリストやたっぷるをJavaの配列に変換するには、 Jythonビルトインのjarray.array( ) というメソッドを使います。このjarray.array( ) は2つの引数をとり、1つめが対象となるPythonリスト、 2つめがその型で、何らかのJavaクラスインスタンスの配列ならそのクラス (例えば java.util.Vector )、Javaのプリミティヴャなデータ型ならそれを表す 1バイトの文字(booleanなら 'z'、intなら 'i'、doubleなら 'd' です)を渡します。

arr = jarray.array( (1,3,4), 'i' )
result.setColumnFilter(arr)

一方、配列を戻り値として返すJavaメソッドから受け取った配列は、 そのまま Python のたっぷるとして扱うことができます。 (たっぷるなので、その要素を直接書き換えたり、 append( ) などのメソッドをコールしたりすることはできません)

for e in result.getData(y):
    print e + "\t",

JythonとJavaのboolean
 Pythonには内部的にBooleanにあたる型がありませんが、 Javaのboolean変数や、booleanを返すメソッドの扱いはどうなるのでしょう。 Jythonでは、Javaのbooleanを「真=1、偽=0」という整数を標準の表現として使います。 従って、booleanを返すJavaメソッドの戻り値をPython変数に代入すると、 真なら整数の1、偽なら0となります。

モジュールのパス
 純粋にPythonで書かれたモジュールは、Jythonが解釈実行するPythonコードの中からインポートできます。 そのときに使われるモジュールのパスは、$JYTHON_HOME/registry の中で

python.path = /usr/local/lib/python2.1/site-packages
のように指定できます。ただし、OS機能に強く依存する一部のパッケージ(pwdなど) はJythonではサポートされていません。

PyObjectオブジェクトの正確なクラス名を知る
 Java世界では、 Pythonコードの変数の値をインタープリタのgetメソッドで取得することができます。 このメソッドが返すデータ型はPyObjectですが、 実際にはこれらのオブジェクトは、Python世界でのデータ型に応じて、 PyInteger、PyLong、PyString、PyTuple、PyListなど、 PyObjectのサブクラスのインスタンスとして作られています。 各オブジェクトの正確なクラスをJava世界で知りたい場合には、次のようにします。

PyObject obj = interp.get("varname");
String className = obj.__class__.__name__;
System.out.println("クラス名は" + className + "です。");

外部JARライブラリとCLASSPATH
 jython.jar以外の外部JARライブラリをインポートできるようにするには、 環境変数CLASSPATHをセットしておきます。 ログインシェルではなく、jythonスクリプト(またはjython.bat) にCLASSPATHのセットをしておく方法もあります。
 この場合、 jython.jarを$JAVA_HOME/jre/lib/extに置かないようにする必要があります。 $JAVA_HOME/jre/lib/extからjython.jarをロードさせると、 クラスローダの関係でCLASSPATHで通した外部JARライブラリをロードできないようです。

セクションのサブメニューに戻る
(first uploaded 2002/03/10 last updated 2004/05/08)