Réponses:
La sortie standard de Python est mise en mémoire tampon (ce qui signifie qu'il collecte certaines des données "écrites" sur la sortie standard avant de les écrire dans le terminal). L'appel le sys.stdout.flush()
force à "vider" le tampon, ce qui signifie qu'il écrira tout ce qu'il contient dans le terminal, même s'il attendrait normalement avant de le faire.
Voici quelques bonnes informations sur les E / S (non) tamponnées et pourquoi elles sont utiles:
http://en.wikipedia.org/wiki/Data_buffer E / S
tamponnées vs non tamponnées
sys.stdout.write("%d" % i)
, alors je dois décommenter l'appel à sys.stdout.flush()
pour que le tampon s'affiche pendant l'exécution du script.
Considérez le script Python simple 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 nombre toutes les secondes pendant cinq secondes, mais si vous l'exécutez tel quel (en fonction de la mise en mémoire tampon par défaut de votre système), vous ne verrez peut-être aucune sortie jusqu'à ce que le script se termine, puis tout à la fois, vous verrez 0 1 2 3 4
imprimé à l'écran.
C'est parce que la sortie est mise en mémoire tampon, et à moins que vous ne vidiez sys.stdout
après chaque, print
vous ne verrez pas la sortie immédiatement. Supprimez le commentaire de la sys.stdout.flush()
ligne pour voir la différence.
Selon ce que je comprends, 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 fermeture du programme. MAIS NOUS POUVONS ÉGALEMENT RINCER LE TAMPON MANUELLEMENT en utilisant l'instruction "sys.stdout.flush ()" dans le programme. Dans le tampon de code ci-dessous 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:~$ 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
print i
pour obtenir votre sortie
Selon ma compréhension, sys.stdout.flush () pousse toutes les données qui ont été mises en mémoire tampon jusqu'à ce point vers 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 () force à vider le tampon et à écrire dans le terminal avant même que le tampon n'ait un espace vide.