Como posso desativar o novo recurso de histórico no Python 3.4?

6

Desde a atualização para o Python 3.4, todos os comandos interativos são registrados em ~/.python_history . Eu não quero que o Python crie ou grave este arquivo.

A criação de um symlink para /dev/null não funciona, o Python remove o arquivo e o recria. A documentação sugere a exclusão do sys.__interactivehook__ , mas isso também remove a conclusão da tabulação. O que deve ser feito para desativar a gravação deste arquivo de histórico, mas ainda preservar a conclusão da tabulação?

Detalhes adicionais:

por Lekensteyn 25.03.2014 / 16:38

7 respostas

1

Para evitar que o Python escreva ~/.python_history , desative o gancho que ativa esse funcionalidade:

import sys
# Disable history (...but also auto-completion :/ )
if hasattr(sys, '__interactivehook__'):
    del sys.__interactivehook__

Se você quiser ativar a conclusão de guias e desativar o recurso de histórico, poderá adaptar o site.enablerlcompleter código. Escreva o seguinte código em ~/.pythonrc e defina export PYTHONSTARTUP=~/.pythonrc em seu shell para ativá-lo.

import sys
def register_readline_completion():
    # rlcompleter must be loaded for Python-specific completion
    try: import readline, rlcompleter
    except ImportError: return
    # Enable tab-completion
    readline_doc = getattr(readline, '__doc__', '')
    if readline_doc is not None and 'libedit' in readline_doc:
        readline.parse_and_bind('bind ^I rl_complete')
    else:
        readline.parse_and_bind('tab: complete')
sys.__interactivehook__ = register_readline_completion
    
por 09.02.2016 / 15:59
5

A partir do Python 3.6, você pode usar readline.set_auto_history para desativar:

import readline
readline.set_auto_history(False)
    
por 09.04.2018 / 18:48
3

Isso funciona para mim.

Criando ~/.pythonrc file:

import os
import atexit
import readline

readline_history_file = os.path.join(os.path.expanduser('~'), '.python_history')
try:
    readline.read_history_file(readline_history_file)
except IOError:
    pass

readline.set_history_length(0)
atexit.register(readline.write_history_file, readline_history_file)

Em seguida, exporte-o:

export PYTHONSTARTUP=~/.pythonrc
    
por 25.03.2014 / 17:38
0

Até que seja consertado de alguma forma no próprio Python, você pode fazer isso em sistemas UNIX:

rm ~/.python-history
mkdir ~/.python-history
sudo chattr +i ~/.python-history || sudo chflags simmutable ~/.python-history

Depois disso, você estará recebendo

Error in atexit._run_exitfuncs:

IsADirectoryError: [Errno 21] Is a directory

toda vez que você termina um shell python. O status de saída ainda será 0 .

Observe que, se você deixá-lo como arquivo, precisará criar e tornar imutável outro arquivo, ~/.python_history

    
por 13.10.2014 / 20:54
0

Coloque o seguinte em um arquivo e defina PYTHONSTARTUP (ou chame o arquivo sitecustomize.py e torne-o acessível a partir do PYTHONPATH )

import readline
import atexit
import sys

sys.__interactivehook__()
atexit.unregister(readline.write_history_file)

Dessa forma, você ainda terá acesso à conclusão de guias e ao histórico anterior, mas os comandos inseridos não serão adicionados ao arquivo de histórico.

    
por 06.02.2016 / 21:44
0

Outra solução ~ / .pythonrc:

import readline
readline.write_history_file = lambda *args: None
    
por 23.07.2016 / 19:23
0

Aqui está o meu método (que acabou sendo basicamente uma versão mais confiável e python do método de berdario). Ele apenas desativa a gravação para .python_history , mas não lê a partir dela, se existir, ou acrescentar novas linhas ao histórico da instância atual. Eu recomendo salvá-lo como site-packages/sitecustomize.py , porque site é o módulo que tanto grava em .python_history e importa sitecustomize se existir , apesar de nomear outra coisa e apontar para ela com PYTHONSTARTUP também.

import sys
oldhook = getattr(sys, '__interactivehook__', None)
if oldhook:
    def newhook():
        import readline, atexit
        oldhook()
        atexit.unregister(readline.write_history_file)
    sys.__interactivehook__ = newhook

update: o que eu fiz para o 3.7, específico para o meu sistema, não para o pep8:

import rlcompleter,readline as r,sys
def f():r.parse_and_bind('tab:complete');r.read_init_file()
sys.__interactivehook__=f
    
por 01.06.2017 / 10:45