226 votes

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

Qu'est-ce que sys.stdout.flush() faire ?

5 votes

228voto

Will Brown Points 3050

La sortie standard de Python est tamponnée (ce qui signifie qu'elle collecte une partie des données "écrites" sur la sortie standard avant de les écrire sur le terminal). Appeler sys.stdout.flush() le force à "flush" le tampon, ce qui signifie qu'il va écrire tout ce qu'il contient dans le terminal, même si normalement il devrait attendre avant de le faire.

Voici quelques bonnes informations sur les E/S (non) tamponnées et leur utilité :
http://en.wikipedia.org/wiki/Data_buffer
IO tamponnée ou non tamponnée

0 votes

@Ciastopiekarz Que peut-on faire pour que la mémoire tampon soit vidée sous Windows ?

0 votes

@Ciastopiekarz Comment le savez-vous ? Si je prends le Python script d'Andrew Clark, et que je remplace la ligne print par sys.stdout.write("%d" % i) alors je dois décommenter l'appel à la fonction sys.stdout.flush() pour obtenir le tampon à afficher pendant que le script s'exécute.

149voto

Andrew Clark Points 77748

Considérons 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 nombre chaque seconde pendant cinq secondes, mais si vous l'exécutez tel qu'il est maintenant (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 d'un seul coup 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 le résultat immédiatement. Enlevez le commentaire de l'élément sys.stdout.flush() pour voir la différence.

63 votes

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 demande à la console de se vider.

9 votes

Je suis simplement confus, lorsque j'enlève la virgule, cela fonctionne bien comme prévu. Existe-t-il une logique de tampon pour les nouvelles lignes ?

10voto

chiru Points 91

D'après ce que j'ai compris, chaque fois que nous exécutons des instructions d'impression, la sortie est écrite dans le tampon. Et nous verrons la sortie à l'écran lorsque le tampon sera vidé (effacé). Par défaut, la mémoire tampon est vidée à la sortie du programme. MAIS NOUS POUVONS AUSSI VIDER LE TAMPON MANUELLEMENT en utilisant l'instruction "sys.stdout.flush()" dans le programme. Dans le code ci-dessous, la mémoire tampon sera vidée lorsque la valeur de i atteindra 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

2voto

JieJ Points 21
import sys
for x in range(10000):
    print "HAPPY >> %s <<\r" % str(x),
    sys.stdout.flush()

2voto

Sagar Dhungel Points 71

D'après ce que j'ai compris, sys.stdout.flush() repousse toutes les données qui ont été mises en mémoire tampon jusqu'à ce point vers un objet fichier. En utilisant 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 dans le terminal. L'utilisation de flush() oblige à vider le tampon et à écrire dans le terminal avant même que le tampon ne soit vide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X