dackdive's blog

新米webエンジニアによる技術ブログ。JavaScript(React), Salesforce, Python など

[python][zsh]インタラクティブシェルで矢印キーを有効にする

原因がzshなのかpythonなのかよくわかりませんが、
インタラクティブシェルで矢印キーが効かない、という問題がこれで解決したのでメモ。

環境

mac OS 10.8.5
iTerm2
zsh
python 2.7.5

現象

ここにも書いてるんですが、pythonインタラクティブシェルを開いて
矢印キーでコマンド履歴をたどろうとすると...

>>> import os
>>> ^[[A

というように、よくわからない記号が表示されるというもの。

解決策

結局こちらの記事にたどり着きました。
(記事の本来の内容は今回の問題のことではないんですが)

.pythonstartupを作ってpythonのインタラクティブモードを拡張する - hirouyukiの日記

で、こちらに書いてあるとおりにやります。

readlineをインストール

easy_install readline

python初期設定ファイル.pythonrc.pyを作る

インタラクティブシェル起動時に読み込まれる設定ファイルを作ります。
記事中では.pythonstartupというファイル名ですが
色々調べていると.pythonrc.pyというファイル名もよく使われてる&
これだとvimで開いた時にpythonファイルとして開いてくれるので
この名前にしました。

# -*- encoding: utf-8 -*-
# Python startup file
import 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

環境変数PYTHONSTARTUPを追加する

私はzshを使っているため、.zshrcに以下を追記

export PYTHONSTARTUP=~/.pythonrc.py

保存したら、反映

source ~/.zshrc

おしまい

この状態でpythonコマンドを打ち、インタラクティブシェルを開くと
矢印キーが正常に機能するようになりました。
Ctrl+P, Ctrl+NとかのEmacsライクな操作も可能。

加えて、記事に書いてあるようなタブ補完も有効になってさらに便利。

>>> import sys
>>> sys.s[ここでTabを押す]
sys.setcheckinterval(   sys.setdlopenflags(     sys.setprofile(         sys.setrecursionlimit(  sys.settrace(           sys.stderr              sys.stdin               sys.stdout              sys.subversion