Historia persistente de la línea de comandos de Python

Me gustaría poder "subir" a los comandos que ingresé en un intérprete de Python anterior. He encontrado elreadline Módulo que ofrece funciones como:read_history_file, write_history_fileyset_startup_hook. No soy lo suficientemente inteligente como para poner esto en práctica, así que, ¿alguien podría ayudarme? Mis pensamientos sobre la solución son:

(1) Modifique .login PYTHONSTARTUP para ejecutar un script de python. (2) En ese archivo de script de Python, haga algo como:

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

(3) Cuando el intérprete salga, escriba el historial en el archivo. Supongo que la mejor manera de hacerlo es definir una función en su script de inicio y salir usando esa función:

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

Sin embargo, es muy molesto tener que salir usando paréntesis:ex(). ¿Hay algo de azúcar pitón que permitaex (sin los parens) para ejecutar elex ¿función?

¿Hay una mejor manera de hacer que el archivo histórico se escriba cada vez? Gracias de antemano por todas las soluciones / sugerencias.

Además, hay dos opciones arquitectónicas como puedo ver. Una opción es tener un historial de comandos unificado. El beneficio es la simplicidad (la alternativa que sigue a las literas de su directorio de inicio con una gran cantidad de archivos). La desventaja es que los intérpretes que usted ejecuta en terminales separados se llenarán con los historiales de comandos de cada uno, y se sobrescribirán los historiales de los demás. (Esto está bien para mí, ya que normalmente me interesa cerrar un intérprete y volver a abrirlo inmediatamente para volver a cargar los módulos, y en ese caso, los comandos de ese 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 que cree:

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 reducir la longitud de la clave aleatoria de 16 a decir 1, podría disminuir el número de archivos que ensucian sus directorios a 36 a expensas de la posible (2.8% de probabilidad) de superposición.

Respuestas a la pregunta(5)

Su respuesta a la pregunta