Como você vê todo o histórico de comandos no Python interativo?


150

Estou trabalhando no interpretador python padrão no Mac OS X e Cmd+ K(limpei) meus comandos anteriores. Eu posso passar por eles um por um usando as teclas de seta. Mas existe uma opção como a opção --history no bash shell, que mostra todos os comandos que você inseriu até agora?


O historycomando shell é um programa como outro qualquer. Não é uma "opção" no bashcomando.
Niloct 08/02

6
Para ser mais preciso: historyé um shell embutido.
blinry

3
Para o iPython, a resposta é %history. E a -gopção obtém sessões anteriores .
22315 Bob Stein

A edição do% history -g +% funciona melhor
Dyno Fu

Respostas:



251

Código para impressão de todo o histórico:

Python 3

Uma linha (copiar e colar rapidamente):

import readline; print('\n'.join([str(readline.get_history_item(i + 1)) for i in range(readline.get_current_history_length())]))

(Ou versão mais longa ...)

import readline
for i in range(readline.get_current_history_length()):
    print (readline.get_history_item(i + 1))

Python 2

Uma linha (copiar e colar rapidamente):

import readline; print '\n'.join([str(readline.get_history_item(i + 1)) for i in range(readline.get_current_history_length())])

(Ou versão mais longa ...)

import readline
for i in range(readline.get_current_history_length()):
    print readline.get_history_item(i + 1)

Nota : get_history_item()é indexado de 1 a n.


31
Um liner:import readline; print '\n'.join([str(readline.get_history_item(i)) for i in range(readline.get_current_history_length())])
Matt

24
Essa resposta (e sua contraparte não exemplar) exemplifica a importância dos exemplos para as pessoas. Obrigado.
Tim S.

8
Legal! Eu adicionei uma history()função com a acima no meu script de inicialização do interpretador Python (um script que é apontado por env. Var $PYTHONSTARTUP). A partir de agora, posso simplesmente digitar history()qualquer sessão de intérprete ;-)
sxc731

2
Sempre que esqueço, como isso é feito, venho aqui pela resposta, obrigado Dennis.
Felipe Valdes

3
Eu estrelou quem sabe quando e estou de volta para pegar essa bondade mais uma vez. B
berto

45

Com o intérprete python 3, a história é escrita para
~/.python_history


Eu não tenho esse diretório e eu uso Python 3.5.2

Isso seria para sistemas operacionais semelhantes ao Unix. Eu era capaz de recuperar a minha história no MacOS comcat ~/.python_history
Ryan H.

1
Obrigado por esta resposta. Mais tarde eu descobri esta coberta nos docs aqui: docs.python.org/3/library/site.html#readline-configuration
Jason V.

4
Infelizmente, a história parece não ser atualizada ao usar ambientes virtuais: - /
ChrisFreeman

4
Você precisa quit()do intérprete para o histórico da sessão atual a serem incluídos no~/.python_history
plexoos

9

Se você deseja gravar o histórico em um arquivo:

import readline
readline.write_history_file('python_history.txt')

A função de ajuda fornece:

Help on built-in function write_history_file in module readline:

write_history_file(...)
    write_history_file([filename]) -> None
    Save a readline history file.
    The default filename is ~/.history.

isso persistirá em sessões de python como o histórico de alavancas do ruby?
lacostenycoder

Talvez essa resposta tenha sido escrita antes da função readline, mas por que não usar readline.write_history_file? @lacostenycoder Você pode usar o readline para ler e gravar um arquivo de histórico que persista.
Joe Holloway

@JoeHolloway Legal, obrigado! Eu mudei a resposta!
Martin Thoma

4

Como o acima exposto funciona apenas para python 2.x e python 3.x (especificamente 3.5), é semelhante, mas com uma ligeira modificação:

import readline
for i in range(readline.get_current_history_length()):
    print (readline.get_history_item(i + 1))

observe o extra ()

(usar shell scripts para analisar .python_history ou python para modificar o código acima é uma questão de gosto pessoal e situação)


3
Win10 C:\>python -m pip install readline=> Collecting readline\ n Downloading https://files.pythonhosted.org/packages/f4/01/2cf081af8d880b44939a5f1b446551a7f8d59eae414277fd0c303757ff1b/readline-6.2.4.1.tar.gz (2.3MB)\ n |████████████████████████████████| 2.3MB 1.7MB/s\ n ERROR: Complete output from command python setup.py egg_info:\ n ERROR: error: this module is not meant to work on Windows\ n ----------------------------------------\ n `ERRO: O comando" python setup.py egg_info "falhou com o código de erro 1 em C: \ Users \ dblack \ AppData \ Local \ Temp \ pip-install-s6m4zkdw \ readline`
bballdave025

1
@ bballdave025 Sim, você não pode pip install readline, mas readlineé instalado por padrão no Windows.
Josiah Yoder

Bem, isso facilita as coisas. @JosiahYoder
bballdave025

@ bballdave025 Desde então, aprendi que ele não é instalado por padrão no Windows, mas se você seguir o link, as instruções fornecerão detalhes - algo como instalar pyreadline ou algo assim.
Josiah Yoder

4

No IPython %history -g, você deve fornecer todo o histórico de comandos. A configuração padrão também salva seu histórico em um arquivo chamado .python_history no diretório do usuário.


3

Uma função simples para obter o histórico semelhante à versão unix / bash.

Espero que ajude algumas pessoas novas.

def ipyhistory(lastn=None):
    """
    param: lastn Defaults to None i.e full history. If specified then returns lastn records from history.
           Also takes -ve sequence for first n history records.
    """
    import readline
    assert lastn is None or isinstance(lastn, int), "Only integers are allowed."
    hlen = readline.get_current_history_length()
    is_neg = lastn is not None and lastn < 0
    if not is_neg:
        flen = len(str(hlen)) if not lastn else len(str(lastn))
        for r in range(1,hlen+1) if not lastn else range(1, hlen+1)[-lastn:]:
            print(": ".join([str(r if not lastn else r + lastn - hlen ).rjust(flen), readline.get_history_item(r)]))
    else:
        flen = len(str(-hlen))
        for r in range(1, -lastn + 1):
            print(": ".join([str(r).rjust(flen), readline.get_history_item(r)]))

Snippet: testado com Python3. Deixe-me saber se há alguma falha no python2. Amostras:

Histórico completo: ipyhistory()

Últimos 10 históricos: ipyhistory(10)

Primeiros 10 História: ipyhistory(-10)

Espero que ajude caras.


oi obrigado Eu criei seu snippet de código em um arquivo xx.py. depois de abrir o python, importei xx. Então tentei ipyhistory (), mas diz: ">>> ipyhistory Traceback (última chamada mais recente): Arquivo" <stdin> ", linha 1, em <module> NameError: name 'ipyhistory' não está definido". O que há de errado?
Chan Kim

Eu já revisto este para não imprimir números de linha uma vez que aqueles normalmente ficam no caminho para mim, mas eu gostei da capacidade de limitação de linha. (Mesmo no Unix, eu costumo cut -c 8tirá-los.)
Josiah Yoder

1

@ Jason-V, isso realmente ajuda, obrigado. então, encontrei esses exemplos e compusi para possuir o snippet.

#!/usr/bin/env python3
import os, readline, atexit
python_history = os.path.join(os.environ['HOME'], '.python_history')
try:
  readline.read_history_file(python_history)
  readline.parse_and_bind("tab: complete")
  readline.set_history_length(5000)
  atexit.register(readline.write_history_file, python_history)
except IOError:
  pass
del os, python_history, readline, atexit 

1

Isso deve fornecer os comandos impressos em linhas separadas:

import readline
map(lambda p:print(readline.get_history_item(p)),
    map(lambda p:p, range(readline.get_current_history_length()))
)

Você pode ser mais específico sobre a formatação do código? Você está dizendo que os parênteses não estão combinando?
Idea4life 31/01

Corrigi a formatação com algum recuo simples. @AleksAndreev você pode remover seu voto negativo.
31418 ChrisFreeman

0

Reaplicação da resposta do Doogle que não imprime números de linha, mas permite especificar o número de linhas a serem impressas.

def history(lastn=None):
    """
    param: lastn Defaults to None i.e full history. If specified then returns lastn records from history.
           Also takes -ve sequence for first n history records.
    """
    import readline
    assert lastn is None or isinstance(lastn, int), "Only integers are allowed."
    hlen = readline.get_current_history_length()
    is_neg = lastn is not None and lastn < 0
    if not is_neg:
        for r in range(1,hlen+1) if not lastn else range(1, hlen+1)[-lastn:]:
            print(readline.get_history_item(r))
    else:
        for r in range(1, -lastn + 1):
            print(readline.get_history_item(r))
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.