rcmdnk's blog

Effective Python: 59 Specific Ways to Write Better Python (Effective Software Development Series)

久々にPYTHONSTARTUPで履歴を保存するように久々に設定しなおしたのでメモ。

Sponsored Links

PYTHONSTARTUP

通常Pythonで対話モードを始めるときには $PYTHONSTARTUPで指定されるファイルが読み込まれます。

-i <file>が渡された時は$PYTHONSTARTUPの代わりに<file>を読み込みます。

また、-c <command>が渡された時は<command>が実行されます。

~/.pythonstartup.py
1
2
#!/usr/bin/env python
print 'Python Startup!'

とか言うファイルを~/.pythonstartup.pyとして置いておくと、

$ export PYTHONSTARTUP="~/.pythonstartup.py"
$ python
Python 2.7.9 (default, Dec 19 2014, 06:00:59)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.56)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
Python Startup!
>>

の様に対話モードの最初にメッセージを出したり出来ます。

PYTHONSTARTUPを設定せずに

$ python -i ~/.pythonstartup.py

したり

$ python -c 'print "Python Startup!"'

でも同じ様になります。

履歴を残して次回も使えるようにする

このスタートアップ時に履歴を読み込んで終了時に書き出す設定を読み込みます。

~/.pythonstartup.py
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env python
try:
    import os
    import readline
    import atexit
    histfile = os.path.join(os.environ["HOME"], ".pyhist")
    open(histfile, 'a').close()
    readline.read_history_file(histfile)
    atexit.register(readline.write_history_file, histfile)
except IOError:
    pass

~/.pyhistに履歴を保存する様にしています。

open(...としてる部分では履歴ファイルが無いときに次で 失敗しないようにtouchしてる様な意味合いです 1

その次のreadline.read_history_fileで ファイルにあるコマンド群を読み込んで履歴に入れます。

atexit.registerで対話モード終了時に実行したい関数を登録出来ます。 引数がある場合は関数名はそのまま()なしで書いて、 atexit.registerの引数として関数名に続いて書いていきます。

readline.write_history_fileで指定したファイルに履歴を書き出せるので このコマンドを登録。

これで対話モードで使ったコマンドの履歴が 次回対話モードを立ち上げ直した時に再び使えます。

ちなみに履歴ファイルの中身は単にコマンドの羅列です。 (.bash_history的な時間情報とかは入ってません。)

Sponsored Links
  1. これを忘れてて、以前上手くいってたのに(以前は多分ファイルを手動で最初に作るなりしてた?) 改めて有効化してみたら履歴が出てこなくてちょっと戸惑ったり。

Sponsored Links

« MacでiTerm2上でHyperSwitch等が使えない問題が治っていたのでターミナルからiTerm2へ出戻りした Python編集環境を整える: pytestとかvimのプラグインとか »