python.exeを捨てよ、街に出よう

予め…python.exe、ほんとに捨てたらダメよん。

Windows における対話モード Python と readline

導入

UNIX系では天国のような快適さを持っているのに、Windows版になると途端に地獄になるのはそう、GNU readline の有無の差である、大抵は。psql (postgreSQL の CLI) もそうだし、Python も同じ。こういうときだけ cygwin に戻りたくなったりもする。

随分前には頑張ってなんとか奮闘したこともあったが、あるとき諦めた。まぁ、linux中心だったからでもあるけれど。

そうなんだけれど、ひとさまに Python をどうしても薦めたい、となったら、「対話モードなら IPython を使おう」とどうしても言いたい。ので、改めてトライしてみた。が…?

理想像@linux

Windowsしか知らない人は多いと思うのであって、「理想像」をお見せしておく。

※動画の上で右クリックして「全て表示」してください。なんでだろうなぁ、両端切れてしまうのですよ…。

動画でみせたポイントとしては、

  1. readlineが使えている(これは UNIX 系で普通にビルドすれば python 本体も同じ)
  2. readlineが「もっと」使えている(TABで補完は素の python では出来ない、など)
  3. readlineが「もっともっと」使えている(前回起動時のヒストリも残っている)
  4. オンラインヘルプへのアクセスが「とっても」簡単
  5. ! で外部コマンド起動出来る

てなところ。他にも数え切れないほど「おいしい」。

IPython は…

簡単に言えば「libpython2.7.so」(など)の「Python本体」を使ってユーザインターフェイスだけ載せ替えたものだと思えば良い。python も libpython2.7.so で書かれている…ようなもの。

ので、「対話モードのために」使うものであって、バッチ起動に IPython を使うのは馬鹿げている。ので「python.exeを捨て」ないように。これはこれ、それはそれ。

IPython on Windows

おぉ、素晴らしいさっそく http://www.lfd.uci.edu/~gohlke/pythonlibs/#ipythonより入手して…

1 me@host: ~$ pip install ipython-2.4.1-py27-none-any.whl

(等)しよう(貴方の環境に合わせたものを持ってくるのだぞ)。

そしてがっかりしよう。

  1. readlineが使えていない(これは Windows 版 python 本体も同じ)

本題:pyreadline、pyreadline-aisは IPython のためにしかない

結論から言うと、pyreadline、pyreadline-ais のどちらか(後者は機能拡張のために前者から fork したもの)を使うことで、IPython は多少快適になる。元の python がダメになるのと引き換えに…。

以下動画ごらんください。

たぶんだが、pyreadline はファイル(bashで言うところの .bash_history)の書き出しに何がしかの前提を置いてしまっているのではないだろうか。ちょいとソースを覗けば直せるのではないかという気もしないでもない。

ところで、動画でワタシかなりタイプミスをしているが、これは本物の GNU readline と違うからである。「ctrl-r」で backword-history-search に入るが、目的のものが見つかって検索モードから抜けるのに、本物であれば「カーソル移動を伴う何か(ctrl-a や ctrl-e)」で即座に抜けられるのであるが、pyreadline、pyreadline-ais はそれが模擬されていないようで、ENTER するしかない、のかな。元を知らない人ならこれでも十分満足出来るでしょうが、本物に慣れきってるとちとツライな。

PyDev とかもいいけど IPython、いいぞ

ネガティブなネタをねじ込んどいてなんですが。スクリプト言語というのは、「とにかく動かして動作を確認しながら逐次的にものを作る」ための対話環境、大事だと思うのだわ。Eclipse が死ぬほど大好きで死にそうな人は PyDev で満足するのであろうし、ほかにも「開発環境」はあるでしょうな。けどね、ディスクに余力があるなら、IPython、入れるだけ入れてみ。きっと気に入るはず。
(IPython Notebook まで紹介したいところだけど、これは今回はやめとく。)

UNIX系なら絶対入れとこう。Windows の場合、「少しでもよりよく」したいなら、UNIX系ほどではないにせよ、入れておこう。その場合は pyreadline 前提にし、元の python を対話モードで使うのは諦めよう。