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を起動してあげると、、、直りました。
皆さんも参考にしてみてください。