1592 votes

Comment puis-je purger la sortie de la fonction print (débuffer la sortie python) ?

Comment puis-je forcer l'utilisation de Python print pour l'afficher à l'écran ?

1891voto

CesarB Points 18048

Dans Python 3, print peut prendre une option flush argument :

print("Hello, World!", flush=True)

En Python 2, vous devrez faire ce qui suit

import sys
sys.stdout.flush()

après avoir appelé print . Par défaut, print imprime à sys.stdout (voir la documentation pour plus d'informations sur objets du fichier ).

443voto

gimel Points 30150

Running python -h Je vois un option de ligne de commande :

-u : stdout et stderr binaires non tamponnés ; également PYTHONUNBUFFERED=x voir la page de manuel pour les détails sur la mise en mémoire tampon interne relative à '-u'.

Voici le documentation pertinente .

342voto

Eugene Sajine Points 1696

Depuis Python 3.3, vous pouvez forcer l'utilisation normale de la fonction print() pour effectuer un rinçage sans avoir à utiliser la fonction sys.stdout.flush() ; il suffit de mettre l'argument du mot-clé "flush" à true. De la documentation :

print(*objets, sep=' ', end=' \n ', file=sys.stdout, flush=False)

Imprime les objets dans le fichier de flux, séparés par sep et suivis par end. sep, end et file, s'ils sont présents, doivent être donnés comme arguments de mots-clés.

Tous les arguments qui ne sont pas des mots-clés sont convertis en chaînes de caractères comme le fait str() et écrits dans le flux, séparés par sep et suivis par end. sep et end doivent être des chaînes de caractères ; ils peuvent aussi être None, ce qui signifie utiliser les valeurs par défaut. Si aucun objet n'est donné, print() écrira simplement end.

L'argument file doit être un objet avec une méthode write(string) ; s'il n'est pas présent ou None, sys.stdout sera utilisé. Le fait que la sortie soit mise en mémoire tampon est généralement déterminé par le fichier, mais si l'argument du mot-clé flush est vrai, le flux est vidé de manière forcée.

72voto

Antony Hatchkins Points 5831

En outre, comme suggéré dans cet article de blog on peut rouvrir sys.stdout en mode non tamponné :

sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

Chaque stdout.write y print L'opération sera automatiquement vidée par la suite.

40voto

Dan Points 18831

Utilisation de la -u fonctionne, mais il est un peu maladroit. Cela signifierait que le programme se comporterait potentiellement de manière incorrecte si l'utilisateur invoquait le script sans l'option -u option. J'utilise généralement un stdout comme ceci :

class flushfile:
  def __init__(self, f):
    self.f = f

  def write(self, x):
    self.f.write(x)
    self.f.flush()

import sys
sys.stdout = flushfile(sys.stdout)

... Maintenant, tous vos print (qui utilisent sys.stdout implicitement), seront automatiquement flush ed.

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