Come vedi l'intera cronologia dei comandi in Python interattivo?


150

Sto lavorando all'interprete predefinito di Python su Mac OS X e ho Cmd+ K(cancellato) i miei comandi precedenti. Posso esaminarli uno per uno usando i tasti freccia. Ma c'è un'opzione come l'opzione --history nella shell bash, che ti mostra tutti i comandi che hai inserito finora?


Il historycomando shell è un programma come un altro. Non è una "opzione" al bashcomando.
Nilotto

6
Per essere precisi: historyè una shell integrata.
Blinry il

3
Per iPython la risposta è %history. E l' -gopzione ottiene sessioni precedenti .
Bob Stein,

% history -g +% edit funziona meglio
Dyno Fu

Risposte:



251

Codice per stampare l'intera storia:

Python 3

One-liner (copia e incolla veloce):

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

(O versione più lunga ...)

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

Python 2

One-liner (copia e incolla veloce):

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

(O versione più lunga ...)

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

Nota : get_history_item()è indicizzato da 1 a n.


31
Una fodera:import readline; print '\n'.join([str(readline.get_history_item(i)) for i in range(readline.get_current_history_length())])
Matt

24
Questa risposta (e la sua controparte non esemplificativa) esemplifica l'importanza degli esempi per le persone. Grazie.
Tim S.

8
Freddo! Ho aggiunto una history()funzione con quanto sopra nel mio script di avvio dell'interprete Python (uno script a cui punta env. Var $PYTHONSTARTUP). Da ora in poi, posso semplicemente digitare history()qualsiasi sessione di interprete ;-)
sxc731

2
Ogni volta che dimentico, come viene fatto, vengo qui per la risposta, grazie Dennis.
Felipe Valdes,

3
Ho recitato questo chissà quando e sono tornato per afferrare questa bontà ancora una volta. 👍🏽
berto

45

Con l'interprete di Python 3 viene scritta la cronologia
~/.python_history


Non ho questa directory e uso Python 3.5.2

Questo sarebbe per sistemi operativi simili a Unix. Sono stato in grado di recuperare la mia storia su macOS concat ~/.python_history
Ryan H.

1
Grazie per questa risposta Più tardi l'ho trovato trattato nei documenti qui: docs.python.org/3/library/site.html#readline-configuration
Jason V.

4
Sfortunatamente, la storia non sembra essere aggiornata quando si usano ambienti virtuali: - /
ChrisFreeman

4
Devi quit()includere l'interprete affinché la cronologia della sessione corrente sia inclusa in~/.python_history
plexoos il

9

Se si desidera scrivere la cronologia in un file:

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

La funzione di aiuto fornisce:

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.

questo persisterà nelle sessioni di Python come la storia dei ruby ​​ruby?
lacostenycoder

Forse questa risposta è stata scritta prima della funzione readline, ma perché non usare readline.write_history_file? @lacostenycoder È possibile utilizzare readline sia per leggere che per scrivere un file cronologico che persiste.
Joe Holloway,

@JoeHolloway Cool, grazie! Ho cambiato la risposta!
Martin Thoma,

4

Poiché quanto sopra funziona solo per Python 2.x per Python 3.x (in particolare 3.5) è simile ma con una leggera modifica:

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

nota il extra ()

(usare script di shell per analizzare .python_history o usare python per modificare il codice sopra è una questione di gusti personali e imho di situazione)


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 `ERRORE: comando" python setup.py egg_info "non riuscito con codice di errore 1 in C: \ Users \ dblack \ AppData \ Local \ Temp \ pip-install-s6m4zkdw \ readline`
bballdave025

1
@ bballdave025 Sì, non è possibile pip install readline, ma readlineè installato per impostazione predefinita su Windows.
Josiah Yoder

Bene, questo semplifica le cose. Grazie @JosiahYoder
bballdave025

@ bballdave025 Da allora ho imparato che non è installato di default su Windows, ma se segui il link, le istruzioni forniscono dettagli - qualcosa come l'installazione di pyreadline o qualcosa del genere.
Josiah Yoder,

4

In IPython %history -gdovrebbe darti l'intera cronologia dei comandi. La configurazione predefinita salva anche la cronologia in un file chiamato .python_history nella tua directory utente.


3

Una semplice funzione per ottenere una cronologia simile alla versione unix / bash.

Spero che aiuti alcune persone nuove.

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)]))

Snippet: testato con Python3. Fammi sapere se ci sono problemi con python2. Campioni:

Storia completa: ipyhistory()

Storia degli ultimi 10: ipyhistory(10)

Prime 10 storie: ipyhistory(-10)

Spero che aiuti i ragazzi.


Ciao grazie. Ho trasformato il tuo frammento di codice in un file xx.py. poi dopo aver aperto Python, ho importato xx. Poi ho provato ipyhistory () ma dice ">>> ipyhistory Traceback (ultima chiamata più recente): File" <stdin> ", linea 1, in <module> NameError: il nome 'ipyhistory' non è definito". Cosa c'è che non va?
Chan Kim,

L'ho modificato per non stampare i numeri di riga poiché quelli di solito mi ostacolano, ma mi è piaciuta la capacità di limitare la linea. (Anche su Unix, di solito cut -c 8li esco.)
Josiah Yoder l'

1

@ Jason-V, aiuta davvero, grazie. poi, ho trovato questi esempi e ho composto il proprio frammento.

#!/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

Questo dovrebbe darti i comandi stampati in righe separate:

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

Puoi per favore essere più specifico sulla formattazione del codice? Stai dicendo che le parentesi non corrispondono?
Idea4life

Ho corretto la formattazione con qualche semplice rientro. @AleksAndreev puoi rimuovere il tuo downvote.
ChrisFreeman,

0

Ripeti la risposta di Doogle che non stampa i numeri delle righe, ma consente di specificare il numero di righe da stampare.

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))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.