Utilisation de la méthode sys.stdout.flush ()

Réponses:

173

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

Marron Haldean
la source
@Ciastopiekarz Que pouvons-nous faire pour que le tampon soit vidé sur Windows?
helplessKirk
@Ciastopiekarz Comment voyez-vous? Si je prends le script Python d'Andrew Clark et que je remplace la ligne d'impression par 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.
Bacon Bits
119

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 4imprimé à l'écran.

C'est parce que la sortie est mise en mémoire tampon, et à moins que vous ne vidiez sys.stdoutaprès chaque, printvous ne verrez pas la sortie immédiatement. Supprimez le commentaire de la sys.stdout.flush()ligne pour voir la différence.

Andrew Clark
la source
48
Dans Python 3.x, 'print i' doit être remplacé par print (i, end = '') car print () dans Python 3 a un préfixe par défaut end = '\ n' qui invite la console à vider.
ofer.sheffer
5
Je suis juste confus, lorsque je supprime la virgule, cela fonctionne bien comme prévu. Y a-t-il une logique de tampon pour les nouvelles lignes ??
Sunil Lulla
7

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
chiru
la source
Il manque une virgule après le print ipour obtenir votre sortie
SwimBikeRun
1
import sys
for x in range(10000):
    print "HAPPY >> %s <<\r" % str(x),
    sys.stdout.flush()
JieJ
la source
1

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.

Sagar Dhungel
la source