web-dev-qa-db-fra.com

Écraser la sortie précédente dans le cahier Jupiter

Supposons que j'ai une partie du code qui s'exécute pendant un certain temps et que chaque seconde génère quelque chose comme ceci: iteration X, score Y. Je remplacerai cette fonction par ma fonction de boîte noire:

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

Maintenant, quand je l'exécute dans Jupyter notebook , il affiche une nouvelle ligne après chaque seconde:

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

Oui, après que la sortie devienne trop grande, le html devient défilable, mais le fait est que je n'ai besoin d'aucune de ces lignes à l'exception de la dernière. Donc, au lieu d'avoir n lignes après n secondes, je veux avoir seulement 1 ligne (la dernière) affichée.

Je n'ai rien trouvé de tel dans la documentation ou dans la magie. ne question avec presque le même titre mais non pertinent.

23
Salvador Dali

@cel a raison: sortie de cellule claire du cahier ipython dans le code

L'utilisation de clear_output () donne cependant à votre ordinateur portable la nervosité. Je recommande également d'utiliser la fonction display (), comme ceci (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(wait=True)
    display('Iteration '+str(i)+' Score: '+str(uniform(0, 1)))
    time.sleep(1)
    i += 1
31
DangerousDave

La façon habituelle (documentée) de faire ce que vous décrivez (qui ne fonctionne qu'avec Python 3) est:

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

Dans Python 2, nous devons sys.stdout.flush() après l'impression, comme cela apparaît dans ce réponse :

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

En utilisant le bloc-notes IPython, j'ai dû concaténer la chaîne pour la faire fonctionner:

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

Et enfin, pour le faire fonctionner avec Jupyter, j'ai utilisé ceci:

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

Ou vous pouvez diviser les print avant et après le time.sleep Si cela a plus de sens, ou vous devez être plus explicite:

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