web-dev-qa-db-ja.com

Pythonターミナルに永続的な履歴を与える

インタラクティブなPythonシェルに、セッション間で実行されたコマンドの履歴を保持するように指示する方法はありますか?

セッションの実行中に、コマンドが実行された後、上向き矢印を使用して上記のコマンドにアクセスできます。次にPythonシェル。

前回のセッションの最後に使用したコマンドをセッションで再利用しているので、これは非常に便利です。

36
mjgpy3

確かに、小さな起動スクリプトでできます。 From インタラクティブな入力編集と履歴の置換 pythonチュートリアル:

# Add auto-completion and a stored history file of commands to your Python
# interactive interpreter. Requires Python 2.0+, readline. Autocomplete is
# bound to the Esc key by default (you can change it - see readline docs).
#
# Store the file in ~/.pystartup, and set an environment variable to point
# to it:  "export PYTHONSTARTUP=~/.pystartup" in bash.

import atexit
import os
import readline
import rlcompleter

historyPath = os.path.expanduser("~/.pyhistory")

def save_history(historyPath=historyPath):
    import readline
    readline.write_history_file(historyPath)

if os.path.exists(historyPath):
    readline.read_history_file(historyPath)

atexit.register(save_history)
del os, atexit, readline, rlcompleter, save_history, historyPath

Python 3.4以降、 インタラクティブインタプリタはオートコンプリートと履歴をすぐにサポートします

readlineをサポートするシステムのインタラクティブインタプリタで、タブ補完がデフォルトで有効になりました。履歴もデフォルトで有効になっており、ファイルに書き込まれます(そしてファイルから読み取られます)~/.python-history

40
Martijn Pieters

IPython を使用します。

とにかく、それは素晴らしいので、あなたはすべきです:永続的なコマンド履歴は、ストックPythonシェルよりも優れている多くの方法の1つにすぎません。

17
Daniel Roseman

これは、Python 3 仮想環境 を使用する場合にも必要です。

仮想環境ごとに履歴ファイルを保持するわずかに異なるバージョンを使用します。

import sys

if sys.version_info >= (3, 0) and hasattr(sys, 'real_prefix'):  # in a VirtualEnv
    import atexit, os, readline, sys

    PYTHON_HISTORY_FILE = os.path.join(os.environ['VIRTUAL_ENV'], '.python_history')
    if os.path.exists(PYTHON_HISTORY_FILE):
        readline.read_history_file(PYTHON_HISTORY_FILE)
    atexit.register(readline.write_history_file, PYTHON_HISTORY_FILE)
1
Javier