Qu'est-ce que sys.stdout.flush()
faire ?
@Ciastopiekarz Que peut-on faire pour que la mémoire tampon soit vidée sous Windows ?
Qu'est-ce que sys.stdout.flush()
faire ?
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
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.
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.
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
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 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.
5 votes
Voir : stackoverflow.com/questions/230751/