組み込みJython のデフォルトエンコーディング指定

java プログラムからjython を使ってpython スクリプトを実行するときに日本語文字列がpython スクリプトに含まれてると例外で落ちるのですが、


python だとデフォルトエンコーディングを指定するのにlib/site-packages/sitecustomize.py を作成して下記のコードを記述しておくのが一般的な解決方法です。

import sys
sys.setdefaultencoding("utf-8")

jython の場合、インストールしてあるディレクトリのLib/site-packages/ にsitecustomize.py を作成してもうまくいきません。

http://bugs.jython.org/issue1552 によれば、sitecustomize.py を呼び出している元のsite.py が組み込みjython からは呼び出されないそうです。逆に言うと、通常はsite.py の中でsys モジュールから削除されるsetdefaultencoding がそのまま残っているということで、

PythonInterpreter jython = new PythonInterpreter();
String script = "import sys\n" +
                "if hasattr(sys, \"setdefaultencoding\"):\n" +
                "    sys.setdefaultencoding(\"utf-8\")\n";
jython.exec(script);
jython.exec("print \"あああ\"");

これでOKっぽい*1です。
sys がsetdefaultencoding を持っているかどうか確認したうえで呼び出すようにしておきつつsitecustomize.py も用意しておけば、site.py が読み込まれるように修正されてもそのまま動くはず。

*1:ただ、eclipse のコンソールには"あああ"の代わりに"???"って表示されましたが…。自分の目的はコンソールへの出力ではなかったので例外投げずに動いたのを確認して以降は追いかけてません。