komeの備忘録

東大理系大学院生の技術ブログ。たまに趣味。

【超便利】pythonのインタラクティブシェルで矢印キーを使う

zshのpythonで矢印キー、履歴、タブ補完を有効にしたくなった

環境
Ubuntu 16.04 Server
Python3.5.1

目次

readline、問題発生

まずはreadlineをぶちこむ。 pythonは入っている前提で話を進める。

$ pip install readline
$ python                                                                                                                                                                                                               
Python 3.5.1 (default, Mar 24 2016, 21:52:39)
[GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.29)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
Traceback (most recent call last):
  File "/Users/hoge/.pythonrc.py", line 4, in <module>
    import readline
ImportError: dlopen(/Users/hoge/.pyenv/versions/3.5.1/lib/python3.5/lib-dynload/readline.cpython-35m-darwin.so, 2): Library not loaded: /usr/local/opt/readline/lib/libreadline.6.dylib
  Referenced from: /Users/hoge/.pyenv/versions/3.5.1/lib/python3.5/lib-dynload/readline.cpython-35m-darwin.so
  Reason: image not found

readlineのインポートができない問題が発生した。 これは、次のページを参考にして、リンク貼り直して解決する。

qiita.com

結論から言うと、/usr/local/opt/readline/lib/libreadline.6.dylib がないのがまずい。なので、libreadline.dylibリンクを貼り直せばよい。

$ sudo  ln -s /usr/local/opt/readline/lib/libreadline.dylib /usr/local/opt/readline/lib/libreadline.6.dylib

続、問題対応

そのあとは、次のリンクを参考にpythonの初期設定ファイルを作る。

dackdive.hateblo.jp

back iとかも使えるようになった。

$ vi ~/.pythonrc.py
# -*- encoding: utf-8 -*-# Python startup fileimport readline
import rlcompleter
import atexit
import os
# tab complete
readline.parse_and_bind('tab: complete')
# history file
histfile = os.path.join(os.environ['HOME'], '.pythonhistory')
try:
    readline.read_history_file(histfile)
except IOError:
    pass
atexit.register(readline.write_history_file, histfile)
del os, histfile, readline, rlcompleter, atexit

動作確認

インタラクティブシェルを立ち上げて、矢印キーが有効であることを確認する。

$ python