notebook nbviewer jupyterhub example course python buffer ipython-notebook

python - jupyterhub - nbviewer



Realiza la impresión del portátil ipython en tiempo real. (3)

Desde Python 3.3, print() tiene un argumento de descarga adicional que se puede usar para forzar la descarga:

for i in range(10): print(i, flush=True) time.sleep(1)

Ipython Notebook no parece imprimir los resultados en tiempo real, pero parece que se almacena en un búfer de cierta manera y luego genera impresiones a granel. ¿Cómo puedo hacer que ipython imprima mis resultados tan pronto como se procesa el comando de impresión?

Código de ejemplo:

import time def printer(): for i in range(100): time.sleep(5) print i

Suponiendo que el código anterior está en un archivo que se importa. ¿Cómo podría hacer que cuando invoco la función de impresora imprima un número cada 5 segundos y no todos los números al final?

Tenga en cuenta que no puedo editar la función de printer() porque la obtengo de algún módulo externo. Quiero que cambie las configuraciones del portátil ipython de alguna manera para que no use un búfer. Por lo tanto, tampoco deseo usar sys.stdout.flush (), quiero hacerlo en tiempo real de acuerdo con la pregunta, no quiero comenzar con ningún búfer.

También intenté cargar el portátil ipython con el comando:

ipython notebook --cache-size=0

pero eso tampoco parece funcionar.


Esta es simplemente una de las respuestas a la pregunta sugerida por Carsten incorpora la delegación __getattr__ sugerida por diedthreetimes en un comentario:

import sys oldsysstdout = sys.stdout class flushfile(): def __init__(self, f): self.f = f def __getattr__(self,name): return object.__getattribute__(self.f, name) def write(self, x): self.f.write(x) self.f.flush() def flush(self): self.f.flush() sys.stdout = flushfile(sys.stdout)

En la respuesta original, el método __getattr__ no está implementado. Sin eso, falla. Otras variantes en las respuestas a esa pregunta también fallan en un cuaderno.

En un cuaderno, sys.stdout es una instancia de IPython.kernel.zmq.iostream.OutStream y tiene una serie de métodos y atributos que no están presentes en el sys.stdout habitual. La delegación de __getattr__ permite que un flushfile de enmascaramiento se enmascare como un ...zmq.iostream.OutStream duck.

Esto funciona en una notebook python 2.7 ejecutada con ipython 3.1.0


Prueba esto:

from IPython.display import display, clear_output display("Hello World") # print string display(df) # print object such as dataframe clear_output(wait=True) # use this if need to clear the output before display, good for dynamic updates