ipython notebook limpar saída de célula no código

132

Em um notebook iPython, tenho um loop while que escuta uma porta serial e printos dados recebidos em tempo real.

O que eu quero alcançar para mostrar apenas os dados recebidos mais recentes (ou seja, apenas uma linha mostrando os dados mais recentes. Sem rolagem na área de saída da célula)

O que eu preciso (eu acho) é limpar a saída da célula antiga quando receber novos dados e depois imprimi-los. Gostaria de saber como posso limpar dados antigos programaticamente?

aha
fonte

Respostas:

265

Você pode usar IPython.display.clear_outputpara limpar a saída de uma célula.

from IPython.display import clear_output

for i in range(10):
    clear_output(wait=True)
    print("Hello World!")

No final deste loop, você verá apenas um Hello World!.

Sem um exemplo de código, não é fácil fornecer código de trabalho. Provavelmente armazenar em buffer os últimos n eventos é uma boa estratégia. Sempre que o buffer mudar, você poderá limpar a saída da célula e imprimi-lo novamente.

cel
fonte
1
Interface ajax mais simples de sempre!
Unni
60
Usar o clear_output(wait=True)geralmente tornará o resultado melhor se você tiver clear_outputdentro de um loop.
Toke Faurby
1
metade da tela após o resultado da impressão treme, mas treme menos graças à espera = True
B.Mr.W.
1
Por que estamos dando laços? O que há com isso i?
jorijnsmit
1
@jorijnsmit, apenas para ilustrar esse "Olá, mundo!" não é impresso 10 vezes, mas apenas 1 vez. irealmente não importa.
18719 cel
2

E, caso você venha aqui, como eu, procurando fazer o mesmo para plotagens em um caderno de Julia em Jupyter, usando Plots, você pode usar:

    IJulia.clear_output(true)

assim, para um tipo de enredo animado de várias execuções

    if nrun==1  
      display(plot(x,y))         # first plot
    else 
      IJulia.clear_output(true)  # clear the window (as above)
      display(plot!(x,y))        # plot! overlays the plot
    end

Sem a chamada clear_output, todos os gráficos são exibidos separadamente.

Marzetti
fonte
2

Você pode usar o IPython.display.clear_output para limpar a saída conforme mencionado na resposta do cel. Eu acrescentaria que, para mim, a melhor solução foi usar essa combinação de parâmetros para imprimir sem qualquer "tremor" do notebook:

from IPython.display import clear_output

for i in range(10):
    clear_output(wait=True)
    print(i, flush=True)
hof.and.or
fonte