インタラクティブなPythonでコマンド履歴全体をどのように確認しますか?


150

私はMac OS XのデフォルトのPythonインタープリターに取り組んでおり、以前のコマンドをCmd+ K(クリア)しています。矢印キーを使って1つずつ確認することができます。しかし、bashシェルの--historyオプションのようなオプションはありますか?これは、これまでに入力したすべてのコマンドを表示しますか?


historyシェルコマンドは、他のどのようなプログラムです。bashコマンドの「オプション」ではありません。
Niloct 2013

6
正確には:historyは組み込みシェルです。
blinry 2013

3
iPython答えがあります%history。そして、-gオプションは以前のセッションを取得します
ボブスタイン

%history -g +%editが最もよく機能します
Dyno Fu

回答:



251

履歴全体を印刷するコード:

Python 3

ワンライナー(迅速なコピーと貼り付け):

import readline; print('\n'.join([str(readline.get_history_item(i + 1)) for i in range(readline.get_current_history_length())]))

(またはより長いバージョン...)

import readline
for i in range(readline.get_current_history_length()):
    print (readline.get_history_item(i + 1))

Python 2

ワンライナー(迅速なコピーと貼り付け):

import readline; print '\n'.join([str(readline.get_history_item(i + 1)) for i in range(readline.get_current_history_length())])

(またはより長いバージョン...)

import readline
for i in range(readline.get_current_history_length()):
    print readline.get_history_item(i + 1)

get_history_item()は1からnまでのインデックスです。


31
1つのライナー:import readline; print '\n'.join([str(readline.get_history_item(i)) for i in range(readline.get_current_history_length())])
Matt

24
この回答(およびその非対応例)は、例が人々にとっていかに重要であるかを例示しています。ありがとう。
Tim S.

8
涼しい!history()上記の関数をPythonインタープリターの起動スクリプト(env。varが指すスクリプト)に追加しました$PYTHONSTARTUP。これからは、history()どのインタープリターセッションでも入力できます;-)
sxc731 '19

2
私が忘れるたびに、これがどのように行われるか、私は答えのためにここに来ます、デニスに感謝します。
フェリペバルデス2018

3
私はこれを知っている人にスターを付けました、そして私はこの良さをもう一度手に入れるために戻ってきました。👍🏽
Bertoの

45

Python 3インタープリターを使用すると、履歴は次の場所に書き込まれます
~/.python_history


私はこのディレクトリがなく、Python 3.5.2を使用しています

これはUnixライクなOSの場合です。私はmacOSで履歴を取得することができましたcat ~/.python_history
Ryan H.

1
この回答をありがとう。私は後でこれがここのドキュメントでカバーされているのを見つけました:docs.python.org/3/library/site.html#readline-configuration
Jason V.

4
残念ながら、仮想環境を使用すると履歴が更新されないようです:-/
ChrisFreeman

4
quit()現在のセッション履歴を含めるには、通訳が必要です~/.python_history
plexoos

9

履歴をファイルに書き込みたい場合:

import readline
readline.write_history_file('python_history.txt')

ヘルプ機能は以下を提供します:

Help on built-in function write_history_file in module readline:

write_history_file(...)
    write_history_file([filename]) -> None
    Save a readline history file.
    The default filename is ~/.history.

これはrubyのpry履歴のようなpythonセッション全体で持続しますか?
lacostenycoder

多分この答えはreadline関数の前に書かれましたが、なぜreadline.write_history_fileを使用しないのですか?@lacostenycoder readlineを使用して、永続的な履歴ファイルの読み取りと書き込みの両方を行うことができます。
ジョーホロウェイ

@JoeHollowayクール、ありがとう!答えを変えました!
Martin Thoma

4

上記はpython 2.xでのみ機能するため、python 3.x(具体的には3.5)も同様ですが、若干の変更が加えられています。

import readline
for i in range(readline.get_current_history_length()):
    print (readline.get_history_item(i + 1))

余分に注意してください()

(シェルスクリプトを使用して.python_historyを解析するか、Pythonを使用して上記のコードを変更することは、個人的な好みと状況によって異なります)


3
Win10 C:\>python -m pip install readline=> Collecting readline\ n Downloading https://files.pythonhosted.org/packages/f4/01/2cf081af8d880b44939a5f1b446551a7f8d59eae414277fd0c303757ff1b/readline-6.2.4.1.tar.gz (2.3MB)\ n |████████████████████████████████| 2.3MB 1.7MB/s\ n ERROR: Complete output from command python setup.py egg_info:\ n ERROR: error: this module is not meant to work on Windows\ n ----------------------------------------\ n `エラー:コマンド「python setup.py egg_info」がC:\ Users \ dblack \ AppData \ Local \ Temp \ pip-install-s6m4zkdwのエラーコード1で失敗しました\ readline`
bballdave025

1
@ bballdave025はい、できませんがpip install readlinereadlineWindowsにはデフォルトでインストールされます。
Josiah Yoder

まあ、それは物事をより簡単にします。ありがとう@JosiahYoder
bballdave025

@ bballdave025私はそれがデフォルトでWindowsにインストールされていないことを知ったのですが、リンクをクリックすると、説明に詳細(pyreadlineのインストールなど)が表示されます。
Josiah Yoder

4

IPython %history -gでは、コマンド履歴全体を提供する必要があります。デフォルトの設定では、履歴がユーザーディレクトリの.python_historyという名前のファイルに保存されます。


3

unix / bashバージョンと同様の履歴を取得する単純な関数。

それが何人かの新しい人々を助けることを願っています。

def ipyhistory(lastn=None):
    """
    param: lastn Defaults to None i.e full history. If specified then returns lastn records from history.
           Also takes -ve sequence for first n history records.
    """
    import readline
    assert lastn is None or isinstance(lastn, int), "Only integers are allowed."
    hlen = readline.get_current_history_length()
    is_neg = lastn is not None and lastn < 0
    if not is_neg:
        flen = len(str(hlen)) if not lastn else len(str(lastn))
        for r in range(1,hlen+1) if not lastn else range(1, hlen+1)[-lastn:]:
            print(": ".join([str(r if not lastn else r + lastn - hlen ).rjust(flen), readline.get_history_item(r)]))
    else:
        flen = len(str(-hlen))
        for r in range(1, -lastn + 1):
            print(": ".join([str(r).rjust(flen), readline.get_history_item(r)]))

スニペット:Python3でテスト済み。python2に問題があるかどうかをお知らせください。サンプル:

完全な歴史: ipyhistory()

過去10件の履歴: ipyhistory(10)

最初の10履歴: ipyhistory(-10)

それが人に役立つことを願っています。


ありがとね。コードスニペットをファイルxx.pyにしました。次に、pythonを開いた後、xxをインポートしました。私がipyhistory()を試しましたが、それは、 ">>> ipyhistory Traceback(最後の最新の呼び出し):ファイル" <stdin> "、1行目<module>のNameError:名前 'ipyhistory'が定義されていません。どうしましたか?
Chan Kim

行番号は通常邪魔になるので、行番号を出力しないように修正しましたが、行制限機能が気に入っています。(Unixであっても、私は通常cut -c 8それらを出します。)
Josiah Yoder

1

@ Jason-V、ありがとう。次に、この例を見つけ、独自のスニペットに構成しました。

#!/usr/bin/env python3
import os, readline, atexit
python_history = os.path.join(os.environ['HOME'], '.python_history')
try:
  readline.read_history_file(python_history)
  readline.parse_and_bind("tab: complete")
  readline.set_history_length(5000)
  atexit.register(readline.write_history_file, python_history)
except IOError:
  pass
del os, python_history, readline, atexit 

1

これにより、コマンドが別々の行に出力されます。

import readline
map(lambda p:print(readline.get_history_item(p)),
    map(lambda p:p, range(readline.get_current_history_length()))
)

コードのフォーマットについてもっと詳しく教えてもらえますか?かっこが一致していませんか?
Idea4life 2018年

簡単なインデントで書式を修正しました。@AleksAndreev自分の反対票を削除できます。
ChrisFreeman、2018

0

焼き直しDoogleプリントラインの数字はないが、印刷する行数を指定することができないの答え。

def history(lastn=None):
    """
    param: lastn Defaults to None i.e full history. If specified then returns lastn records from history.
           Also takes -ve sequence for first n history records.
    """
    import readline
    assert lastn is None or isinstance(lastn, int), "Only integers are allowed."
    hlen = readline.get_current_history_length()
    is_neg = lastn is not None and lastn < 0
    if not is_neg:
        for r in range(1,hlen+1) if not lastn else range(1, hlen+1)[-lastn:]:
            print(readline.get_history_item(r))
    else:
        for r in range(1, -lastn + 1):
            print(readline.get_history_item(r))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.