MacのPythonで対話コンソールの履歴が遡れない

pyenvでpythonの環境を構築していたのですがある時から、対話コンソールで上下キーを押しても直前に打ったコマンドの履歴を遡れなくなってしまった。

代わりに、コンソールには^[[A^[[Bが表示されるようになった。

いろいろ原因を探っていると、readlineというライブラリが原因らしいことがわかった。

と言うわけで確認してみると以下のようなエラーが出た。

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

どうやら、ライブラリが無いらしい

と言うわけで

brew install readline

で入れてみたら

Warning: readline 8.0.0 is already installed and up-to-date
To reinstall 8.0.0, run `brew reinstall readline`

どうやら既に入っているらしい…

よく確認してみると入っているバージョンが8であることに気がついた。

pythonで求められているのはバージョン7である。

以前は動いていたことを考えるとhomebrewの自動アップデートでバージョンが変わってしまったことが原因らしい。

バージョンを下げようかとも思ったが、いくつか依存しているライブラリがあるのでそう簡単に下げられそうもない

解決法

最終的に、シンボリックリンクを作って対応することにした。

ln -s /usr/local/opt/readline/lib/libreadline.8.dylib /usr/local/opt/readline/lib/libreadline.7.dylib 

バージョンが違うので、どこかで不具合が出そうだが 今は動いているのでしばらくの間は問題ないだろう。

参考

https://qiita.com/nwtgck/items/f5427c0d0f7827658bd5

https://stackoverflow.com/questions/3483723/python-interactive-mode-history-and-arrow-keys