Que fait sys.stdout.flush()
?
La sortie standard de Python est mise en mémoire tampon (c’est-à-dire qu’elle collecte certaines des données "écrites" dans la sortie standard avant de les écrire sur le terminal). L'appel de sys.stdout.flush()
le force à "vider" le tampon, ce qui signifie qu'il va tout écrire dans le tampon sur le terminal, même s'il attend normalement avant de le faire.
Voici quelques informations utiles sur les E/S (non) tamponnées et leur utilité:
http://en.wikipedia.org/wiki/Data_buffer
entrées-sorties avec ou sans tampon
Considérez le simple script Python suivant:
import time
import sys
for i in range(5):
print(i),
#sys.stdout.flush()
time.sleep(1)
Ceci est conçu pour imprimer un numéro toutes les secondes pendant cinq secondes, mais si vous l'exécutez tel quel (en fonction de la mise en mémoire tampon du système par défaut), il se peut que vous ne voyiez aucune sortie tant que le script n'est pas terminé, puis vous verrez tout d'un coup 0 1 2 3 4
imprimé à l'écran.
En effet, la sortie est mise en mémoire tampon. Si vous ne videz pas sys.stdout
après chaque print
, vous ne verrez pas immédiatement la sortie. Supprimez le commentaire de la ligne sys.stdout.flush()
pour voir la différence.
Selon ma compréhension, chaque fois que nous exécutons des instructions d'impression, la sortie sera écrite dans la mémoire tampon. Et nous verrons la sortie à l’écran lorsque le tampon sera vidé (effacé). Par défaut, le tampon sera vidé à la sortie du programme. MAIS WE POUVONS AUSSI RINCER MANUELLEMENT LE TAMPON en utilisant l'instruction "sys.stdout.flush ()" dans le programme. Dans le code ci-dessous, le tampon sera vidé lorsque la valeur de i atteint 5.
Vous pouvez comprendre en exécutant le code ci-dessous.
chiru @ online: ~ $ cat flush.py
import time
import sys
for i in range(10):
print i
if i == 5:
print "Flushing buffer"
sys.stdout.flush()
time.sleep(1)
for i in range(10):
print i,
if i == 5:
print "Flushing buffer"
sys.stdout.flush()
chiru @ online: ~ $
*****SORTIE*****
chiru @ online: ~ $ python flush.py
0 1 2 3 4 5 Flushing buffer
6 7 8 9 0 1 2 3 4 5 Flushing buffer
6 7 8 9
chiru @ online: ~ $
Selon ma compréhension, sys.stdout.flush () envoie toutes les données qui ont été mises en mémoire tampon à ce point dans un objet fichier. Lors de l’utilisation de stdout, les données sont stockées dans la mémoire tampon (pendant un certain temps ou jusqu’à ce que la mémoire soit remplie) avant d’être écrites sur le terminal. L'utilisation de flush () oblige à vider le tampon et à écrire sur le terminal avant même que le tampon ne dispose plus d'espace libre.
import sys
for x in range(10000):
print "HAPPY >> %s <<\r" % str(x),
sys.stdout.flush()