2016-07-23 16 views
5

Angenommen, ich habe einen Teil des Codes, der für eine bestimmte Zeit läuft und jede 1 Sekunde so etwas ausgibt: iteration X, score Y. Ich werde diese Funktion mit meiner Blackbox-Funktion ersetzen:Vorherige Ausgabe in Jupyter-Notizbuch überschreiben

from random import uniform 
import time 

def black_box(): 
    i = 1 
    while True: 
     print 'Iteration', i, 'Score:', uniform(0, 1) 
     time.sleep(1) 
     i += 1 

Nun, wenn ich es in Jupyter notebook laufen, es Ausgabe eine neue Zeile nach jeder Sekunde:

Iteration 1 Score: 0.664167449844 
Iteration 2 Score: 0.514757592404 
... 

Ja, nach, wenn die Ausgabe wird zu groß, das html wird scrollbar, aber die Sache ist, dass ich keine dieser Zeilen benötige, bis auf die aktuellste. Anstatt also n Zeilen nach n Sekunden zu haben, möchte ich nur die Zeile 1 (die letzte) angezeigt haben.

Ich habe nichts dergleichen in der Dokumentation gefunden oder durch Magie schauen. A question mit fast dem gleichen Titel aber irrelevant.

+0

dies eine Lösung sein könnte: http://stackoverflow.com/questions/24816237/ipython-notebook-clear-cell- output-in-code – cel

Antwort

5

Die übliche (dokumentiert) Art und Weise, was Sie zu tun beschreiben (das nur mit Python 3 funktioniert) ist:

print('Iteration', i, 'Score:', uniform(0, 1), end='\r') 

In Python 2 wir sys.stdout.flush() nach dem Druck haben, wie es in diesen answer zeigt:

print('Iteration', i, 'Score:', uniform(0, 1), end='\r') 
sys.stdout.flush() 

Mit IPython Notebook hatte ich die Zeichenfolge verketten, damit es funktioniert:

print('Iteration ' + str(i) + ', Score: ' + str(uniform(0, 1)), end='\r') 

Und schließlich, um es mit Jupyter funktioniert, habe ich dies:

print('\r', 'Iteration', i, 'Score:', uniform(0, 1), end='') 

Oder Sie könnten die print s vor und nach dem time.sleep teilen, wenn es mehr Sinn macht, oder Sie brauchen mehr explizit zu sein:

print('Iteration', i, 'Score:', uniform(0, 1), end='') 
time.sleep(1) 
print('', end='\r') # or even print('\r', end='') 
+0

Auf MacOS scheint dies keine Ausgabe im Notebook zu erzeugen. – cel

+0

@cel, nach der Installation und dem Versuch mit Jupyter funktioniert es auch nicht unter Linux. Es ist nicht das Betriebssystem, muss eine Änderung von jupyter gemacht werden. – chapelo

+1

@cel Gefunden ein * hack *, damit es mit Jupyter funktioniert :) – chapelo

5

@cel hat recht: wenn ipython notebook clear cell output in code

die clear_output Mit() gibt macht Ihr Notebook Bammel haben. Ich empfehle die Anzeige() -Funktion als auch, wie dieser (Python 2.7):

from random import uniform 
import time 
from IPython.display import display, clear_output 

def black_box(): 
i = 1 
while True: 
    clear_output() 
    display('Iteration '+str(i)+' Score: '+str(uniform(0, 1))) 
    time.sleep(1) 
    i += 1 
+0

Eine gute Antwort! Der Name des Moduls sollte "IPython" sein, denke ich. – Cnly

+0

upvoted. Dank dafür. – Cnly

+0

Für schnell-iterierende Schleifen empfehle ich clear_output (wait = True).Wenn der Parameter auf "true" gesetzt ist, verzögert sich die Löschung, bis eine neue Eingabe empfangen wird. –