Me gustaría poder "hacer una flecha arriba" a los comandos que ingresé en un intérprete de Python previo. Encontré el módulo readline
que ofrece funciones como: read_history_file
, write_history_file
y set_startup_hook
. Aunque no soy lo suficientemente inteligente como para poner esto en práctica, ¿alguien podría ayudarme? Mis pensamientos sobre la solución son:Historial de la línea de comandos de Python persistente
(1) Modifique .login PYTHONSTARTUP para ejecutar un script de python. (2) En ese archivo script en Python hacer algo como:
def command_history_hook():
import readline
readline.read_history_file('.python_history')
command_history_hook()
(3) Siempre que las salidas de intérprete, escribir la historia en el archivo. Creo que la mejor manera de hacer esto es definir una función en el script de inicio y salida utilizando esa función:
def ex():
import readline
readline.write_history_file('.python_history')
exit()
Es muy molesto tener que salir el uso de paréntesis, sin embargo: ex()
. ¿Hay algún azúcar python que permitiría ex
(sin paréntesis) ejecutar la función ex
?
¿Hay una mejor manera de hacer que el archivo de historial escriba cada vez? Gracias de antemano por todas las soluciones/sugerencias.
Además, hay dos opciones arquitectónicas que puedo ver. Una opción es tener un historial de comando unificado. El beneficio es la simplicidad (la alternativa que sigue almacena el directorio de inicio con muchos archivos). La desventaja es que los intérpretes que ejecuta en terminales separados se rellenarán con los historiales de comando de los demás y sobrescribirán los historiales de los demás. (Esto está bien para mí ya que normalmente estoy interesado en cerrar un intérprete y reabrir uno inmediatamente para volver a cargar los módulos, y en ese caso los comandos del intérprete se habrán escrito en el archivo). Una posible solución para mantener archivos de historial separados por terminal es escribir una variable de entorno para cada nueva terminal se 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()
al disminuir la longitud de la clave aleatoria del 16 al decir 1 se podría reducir el número de archivos que cubrían sus directorios a 36 a expensas de una posible (2,8 % chance) de superposición.
+1 para iPython. –
Gracias, la variable env PYTHONSTARTUP y la función atexit.register son lo que quería. De acuerdo con su entrada, sin embargo, probablemente solo esté usando iPython. ¡Gracias! –
Gracias por esto. Eres increíble. –