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.
+1 per iPython. –
Grazie, la variabile env PYTHONSTARTUP e la funzione atexit.register sono ciò che volevo. Basandomi sull'input, probabilmente userò solo iPython. Grazie! –
Grazie per questo. Sei fantastico. –