[Python-ml-jp 4153] Mac OS X Leopard 上の python readline

SUZUKI Hisao suzuki611 @ mac.com
2007年 10月 28日 (日) 23:46:42 JST


[Python-ml-jp 4152] でふれたように Mac OS X Leopard には
Python 2.5.1 が付属しています。

Leopard の Terminal はデフォルトで bash や emacs で日本語が
使えるようになっています。bash 起動前に LANG がセットされる
ため,GNU readline による bash の行編集で漢字が漢字として
認識されます。もう ~/.MacOSX による設定は不要です。

さらに python や ruby (irb) の対話セッションで行編集が使える
ようになっています。
しかし,この行編集機能を実現している readline ライブラリが
どうも (GPL を回避するためか?) GNU ではなく互換ライブラリ
である模様です (?_?)

そのため python の対話セッションには,二つ,問題があります。

1. stty の設定が保存されない。
   例えば,stty kill undef としていても,対話セッションを
   終えるとデフォルトの stty kill ^U に戻ってしまいます。

2. 日本語入力ができない。
   ことえりで変換を確定した瞬間に拒絶されます。


結局,カスタマイズ用のフォルダに GNU の readline で作った
readline.so を置き,それを優先させるようにして,さしあたり
この問題を解決できました。

参考のため,メモを書いておきます。

 1. cp -p ~/tmp/Python-2.5.1/Modules/readline.c .
 2. gzcat ~/tmp/readline-5.2.tar.gz | tar xvf -

   cd readline-5.2
   patch -b < ~/tmp/readline52-001
   ...以下同様に
   patch -b < ~/tmp/readline52-007
   cd ..

 3. mv readline-5.2 readline
 4. cd readline
 5. ./configure --disable-static
 6. echo '#define NEED_EXTERN_PC 1' >> config.h
 7. make
    (これは "-compatibility_version only allowed with -dynamiclib"
    のエラーで終了する)
 8. cd shlib
 9. mv *.so ../..
10. cd ../..
11. 下記の setup.py を用意する。

from distutils.core import setup, Extension

READLINE_OBJS = [
    "bind.so", "callback.so", "compat.so", "complete.so", "display.so",
    "funmap.so", "histexpand.so", "histfile.so", "history.so",
    "histsearch.so", "input.so", "isearch.so", "keymaps.so", "kill.so",
    "macro.so", "mbutil.so", "misc.so", "nls.so", "parens.so", "readline.so",
    "rltty.so", "search.so", "shell.so", "signals.so", "terminal.so",
    "text.so", "tilde.so", "undo.so", "util.so", "vi_mode.so", "xmalloc.so",
    "-ltermcap"
]

setup(name="readline",
      ext_modules=[
    Extension(name="readline",
              sources=["readline.c"],
              extra_compile_args=["-I."],
              extra_link_args=READLINE_OBJS)])


12. python setup.py build
    (MacBook ではここで PPC 用に *.so が作られていないと警告される)

13. build/lib.macosx-10.5-i386-2.5/ の readline.so を
    /Library/Python/2.5/site-packages/ にコピーする。

最後に /Library/Python/2.5/site-packages/ に下記の sitecustomize.py
を置きます。

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

import imp
imp.load_dynamic('readline', '/Library/Python/2.5/site-packages/readline.so')

こうすることで,ユーザにとってうかつに変更してはならない
/System/Library 以下にある lib-dynload/ に一切触らずに
readline.so をすげかえることができます。

この方法の問題点は

(1) 必要がないときでも readline.so を読み込むため,おそらく
    ベンチマークで少し不利になる。
(2) この方法ではユニバーサルな readline.so ができない。

です。

# irb については… jruby の jirb でも行編集ができるとはいえ
# まだ手つかずです。(オフトピック)

-- SUZUKI Hisao




Python-ml-jp メーリングリストの案内