2019年08月19日

Jython のコンソールを切り替える

Jython 2.7.1 を使うと冒頭にだらだらと警告を吐くようになってしまった。

下記の通り始まって25行ほど続く。

[ERROR] Failed to construct terminal; falling back to unsupported
  java.lang.NumberFormatException: For input string: "0x100"
  at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)

原因

コンソール用に組み込まれてる JLine と環境変数 TERM の組み合わせが問題。どうせ対話シェルはほとんど使わないのでもっと低機能なものに切り替える。

バグ自体は JLine 2.14.4 (2017年6月)で修正済み。Jython でも JLine を更新するコミットはされているがリリースがいつになるかわからない。

設定

python.console で切り替えられる。java の起動時に -D で渡す。

java -Dpython.console=org.python.org.PlainConsole -cp jython-standalone-2.7.1.jar:$CLASSPATH org.python.util.jython

このように明示的に指定しても python.console= と空にして Jython にフォールバックを任せてもいい。

別解

回避するだけなら TERM 変数を空にしたりいじったりしてもいいが、ターミナルの種類と食い違うと対話シェルとして起動したときに妙な挙動をすることがあるので注意。

または apt でインストールする方の Jython は問題ない。パッケージが libjline2-java に依存しているのでそっちを読みに行くのだと思う。

うまくいかなかったもの

python.console= に指定する値(あるいは空でもいいということ)がなかなか見つからなかった。ちなみにこれら不適切な値でも一応動くし、対話的に起動すればフォールバックのコンソールも立ち上がる。警告が見苦しいだけで。

org.python.util.ReadlineConsole

JythonWiki の NewUsersGuide にはこれがデフォルトと書いてある。

console: Failed to install 'org.python.util.ReadlineConsole': java.lang.ClassNotFoundException: org.python.util.ReadlineConsole.

jython リポジトリの設定ファイル例にひっそりと ReadlineConsole は 2.7 で取り除かれましたとあった。コミットは 2015 年 1月。

org.python.util.InteractiveConsole

Settings ではこれがデフォルトと書いてある。あと Jython の開発者が 2018 年に回答したりもしてる: readline - How to deactivate JLine for Jython interactive interpreter session? - Stack Overflow

console: Failed to install 'org.python.util.InteractiveConsole': does not implement interface org.python.core.Console.

2013年のメーリングリストへの投稿では InteractiveConsole はコンソールではなくインタプリタになったのでこれを console に指定しても使えないとある。

org.python.util.PlainConsole

ConsoleChoices に Jline 、 Readline と並んで PlainConsole がある。

console: Failed to install 'org.python.util.PlainConsole': java.lang.ClassNotFoundException: org.python.util.PlainConsole.

→よく見直すと util ではなくて core だった。

参考

posted by かぷらす at 20:48| Comment(0) | 作業記録 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
コチラをクリックしてください