2009-07-27 14 views
14

Mi piacerebbe essere in grado di "su-freccia" per i comandi che ho inserito in un precedente interprete Python. Ho trovato il modulo readline che offre funzioni come: read_history_file, write_history_file e set_startup_hook. Non sono abbastanza esperto da metterlo in pratica, quindi qualcuno potrebbe aiutarmi per favore? I miei pensieri sulla soluzione sono:Cronologia della riga di comando di Python persistente

(1) Modifica .login PYTHONSTARTUP per eseguire uno script python. (2) In questo file di script python fare qualcosa di simile:

def command_history_hook(): 
    import readline 
    readline.read_history_file('.python_history') 
command_history_hook() 

(3) Ogni volta che le uscite interprete, scrivere la storia del file. Credo che il modo migliore per farlo è quello di definire una funzione nel vostro script di avvio e di uscita utilizzando tale funzione:

def ex(): 
    import readline 
    readline.write_history_file('.python_history') 
    exit() 

E 'molto fastidioso dover uscire utilizzando le parentesi, però: ex(). C'è dello zucchero di pitone che consentirebbe a ex (senza i paren) di eseguire la funzione ex?

C'è un modo migliore per far scrivere il file di cronologia ogni volta? Grazie in anticipo per tutte le soluzioni/suggerimenti.

Inoltre, ci sono due scelte architettoniche come posso vedere. Una scelta è avere una cronologia dei comandi unificata. Il vantaggio è la semplicità (l'alternativa che segue è quella della tua home directory con molti file.) Lo svantaggio è che gli interpreti che esegui in terminali separati verranno popolati con le storie di comando degli altri e sovrascriveranno le storie degli altri. (questo va bene per me dato che di solito sono interessato a chiudere un interprete e riaprirlo immediatamente per ricaricare i moduli, e in tal caso i comandi dell'interprete saranno stati scritti nel file.) Una possibile soluzione per mantenere file di cronologia separati per terminale è quello di scrivere una variabile d'ambiente per ogni nuovo terminale si crea:

def random_key() 
    ''.join([choice(string.uppercase + string.digits) for i in range(16)]) 

def command_history_hook(): 
    import readline 
    key = get_env_variable('command_history_key') 
    if key: 
     readline.read_history_file('.python_history_{0}'.format(key)) 
    else: 
     set_env_variable('command_history_key', random_key()) 

def ex(): 
    import readline 
    key = get_env_variable('command_history_key') 
    if not key: 
     set_env_variable('command_history_key', random_key()) 
    readline.write_history_file('.python_history_{0}'.format(key)) 
    exit() 

diminuendo la lunghezza della chiave caso da 16 a dire 1 si potrebbe ridurre il numero di file di sporcare le directory a 36 a scapito di possibili (2.8 % di probabilità) di sovrapposizione.

risposta

13

Penso che i suggerimenti nella documentazione di Python coprano praticamente ciò che si desidera. Guarda il file pystartup di esempio verso la fine della sezione 13.3:

o visualizzare questa pagina:

Ma, per un fuori del guscio scatolare interattivo che fornisce tutto questo e altro, dai un'occhiata a IPython:

+0

+1 per iPython. –

+0

Grazie, la variabile env PYTHONSTARTUP e la funzione atexit.register sono ciò che volevo. Basandomi sull'input, probabilmente userò solo iPython. Grazie! –

+0

Grazie per questo. Sei fantastico. –

4

Provare a utilizzare IPython come una shell python. Ha già tutto ciò che chiedi. Hanno pacchetti per le distro più popolari, quindi l'installazione dovrebbe essere molto semplice.

+0

Accetto. Ho usato ipython per un po 'ed è fantastico, ha l'auto-completamento e la funzione di cronologia che stai cercando. – dalloliogm

+0

Sto usando IPython (su Windows oggi), ma quando lo eseguo, i miei tasti freccia su/giù non mi forniscono alcuna cronologia dei comandi. Che cosa sto facendo di sbagliato? –

+2

SOLUZIONE: 'easy_install pyreadline' per avere i tasti freccia su/giù per sfogliare la cronologia dei comandi su Windows. Inoltre alcune altre cose (come i colori!) Funzionano ora. –

0

Usa PIP per installare il pyreadline pacchetto:

pip install pyreadline 
+0

Ho usato pip install readline – Anoyz

0

Se invece si è interessati ad utilizzare la sostituzione storia interattiva, senza tutta la roba di file, tutto quello che dovete fare è di importazione readline:

import readline 

E quindi è possibile utilizzare i tasti su/giù per navi cancella i comandi precedenti. Lo stesso per 2 o 3.

Questo non mi è stato chiaro dai documenti, ma forse l'ho perso.

1

La cronologia persistente è stata supportata immediatamente dopo Python 3.4. Vedi this bug report.

Problemi correlati