Comment puis-je forcer l'utilisation de Python print
pour l'afficher à l'écran ?
Réponses
Trop de publicités?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 ).
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 .
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.
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.
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.