Histórico de linha de comando do Python Persistente

Eu gostaria de ser capaz de "seta para cima" para comandos que eu insiro em um interpretador Python anterior. Eu encontrei oreadline módulo que oferece funções como:read_history_file, write_history_fileeset_startup_hook. Eu não sou bastante esperta o suficiente para colocar isso em prática, então alguém poderia me ajudar? Meus pensamentos sobre a solução são:

(1) Modifique .login PYTHONSTARTUP para executar um script python. (2) Nesse arquivo de script python, faça algo como:

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

(3) Sempre que o intérprete sair, escreva o histórico no arquivo. Eu acho que a melhor maneira de fazer isso é definir uma função no seu script de inicialização e sair usando essa função:

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

É muito chato ter que sair usando parênteses, no entanto:ex(). Existe algum açúcar python que permitiriaex (sem os parênteses) para executar oex função?

Existe uma maneira melhor de fazer com que o arquivo de histórico seja gravado a cada vez? Agradecemos antecipadamente por todas as soluções / sugestões.

Além disso, existem duas opções arquitetônicas, como posso ver. Uma escolha é ter um histórico de comando unificado. O benefício é a simplicidade (a alternativa que segue cria seu diretório pessoal com muitos arquivos.) A desvantagem é que os interpretadores executados em terminais separados serão preenchidos com os históricos de comandos um do outro e substituirão os históricos uns dos outros. (isso é bom para mim já que estou geralmente interessado em fechar um intérprete e reabrir um imediatamente para recarregar módulos, e nesse caso os comandos do intérprete terão sido gravados no arquivo.) Uma solução possível para manter arquivos de histórico separados por terminal é gravar uma variável de ambiente para cada novo terminal criado:

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

Ao diminuir o comprimento da chave aleatória de 16 para dizer 1, você pode diminuir o número de arquivos que deixam seus diretórios em 36, à custa de possíveis (2,8% de chance) de sobreposição.

questionAnswers(5)

yourAnswerToTheQuestion