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