mac pythonで方向キーが使えなくなった際にやったこと

macでpythonを動かしていたら、いつの間にか方向キーでのhistoryが効かなくなっていました。

致命傷ではないものの、これがないと地味に不便・・・。

最終的に無事解決したのですが、解決までに至った経緯を書き留めておきます。

症状 : 方向キーが効かない!

Python 3.5.4 (default, Jun 5 2018, 22:13:16)
[GCC 4.2.1 Compatible Apple LLVM 9.1.0 (clang-902.0.39.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> ^[[A^[[B^[[D^[[C

なんか方向キーの入力でよく見るやつです。

← ↑ → ↓   こいつらが・・・   ^[[A ^[[B ^[[C ^[[D

こうなってしまいます。

try1 : readlineをインストールし直す

色々調べていくと、どうやらpythonの方向キーでのhistory表示にはreadlineというライブラリを使用していることが判明。

とりあえず、pipでreadlineを入れる。

$ pip install readline

。。。直らず。

try2 : readlineはあるのか

調べる。readlineの場所、バージョンなどを確認。

$ ls -al /usr/local/opt/readline/lib
----------
total 1448
drwxr-xr-x  11 user_name  admin     352 12 20 06:07 .
drwxr-xr-x  12 user_name  admin     384  4  5 16:24 ..
-r--r--r--   1 user_name  admin   40396  4  5 16:24 libhistory.8.0.dylib
lrwxr-xr-x   1 user_name  admin      20 12 20 06:07 libhistory.8.dylib -> libhistory.8.0.dylib
-r--r--r--   1 user_name  admin   45848 12 20 06:07 libhistory.a
lrwxr-xr-x   1 user_name  admin      20 12 20 06:07 libhistory.dylib -> libhistory.8.0.dylib
-rw-r--r--   1 user_name  admin  239260  4  5 16:24 libreadline.8.0.dylib
lrwxr-xr-x   1 user_name  admin      21 12 20 06:07 libreadline.8.dylib -> libreadline.8.0.dylib
-r--r--r--   1 user_name  admin  406384 12 20 06:07 libreadline.a
lrwxr-xr-x   1 tuser_name  admin      21 12 20 06:07 libreadline.dylib -> libreadline.8.0.dylib
drwxr-xr-x   3 user_name  admin      96  4  5 16:24 pkgconfig

確かにある。

libreadlineのバージョンは8.0のようだ。

try3 : pythonで呼んでみる

python内でreadlineをimportしてみた。

>>> import readline
Traceback (most recent call last): File "<stdin>", line 1, in <module>
ImportError: dlopen(/Users/strymj/.pyenv/versions/3.5.4/lib/python3.5/lib-dynload/readline.cpython-35m-darwin.so, 2):
Library not loaded: /usr/local/opt/readline/lib/libreadline.7.dylib Referenced from: /Users/strymj/.pyenv/versions/3.5.4/lib/python3.5/lib-dynload/readline.cpython-35m-darwin.so
Reason: image not found

あれ。。。?

なぜかlibreadline.7.dylibを呼びに行っている。入っているlibreadlineはlibreadline.8.dylibなのに。

そういうことか。

応急処置 : とりあえずシンボリックリンクを貼る

/usr/local/opt/readline/lib/libreadline.8.dylibを読み込みたいのに、

/usr/local/opt/readline/lib/libreadline.7.dylibを呼んでいるので、とりあえず応急処置としてシンボリックリンクを貼ってあげる。

$ ln -s libreadline.dylib libreadline.7.dylib

この後もう一度pythonを起動してあげると、、、直りました。
皆さんも参考にしてみてください。