stdout Python ne correctement vide pas après avoir appelé malédictions
Question
J'ai un programme qui utilise malédictions, puis retourne au script principal pour un traitement ultérieur. Après il retourne, ma sortie après stdout ne semble pas jusqu'à ce qu'il ya une grande quantité de celui-ci (par exemple des milliers d'octets).
J'ai réduit le problème à un programme très simple qui ne fiable:
import curses
import time
curses.initscr()
curses.endwin()
print "Hello world!"
time.sleep(5)
Si je commente les deux malédictions appelle, le «Bonjour tout le monde! impressions avant le délai. Si je les mets, il imprime après le délai (lorsque les sorties de script).
La solution
L'appel curses.endwin()
« back E / S standard ensembles à la normale » ... ce qui signifie malheureusement « tamponne » (vous pouvez considérer qu'un bogue dans curses
et déposer le bug sur le suivi de Python).
Pour assurer-sortie standard est unbuffered,
import os
sys.stdout = os.fdopen(0, 'w', 0)
(Vous pouvez mettre le import os
au début, ou bien sûr, la réaffectation de sys.stdout
est censé aller juste après l'appel endwin
).
Autres conseils
Alex m'a battu à lui (il savait, je devais le comprendre), mais je l'ai écrit ce gestionnaire de contexte astucieux que vous pourriez être en mesure d'utiliser.
import curses
import time
import os
import sys
class CursesStdout(object):
def __enter__(self):
pass
def __exit__(self, *args):
sys.stdout = sys.__stdout__ = os.fdopen(sys.__stdout__.fileno(), 'w', 0)
with CursesStdout():
curses.initscr()
curses.endwin()
print "Hello world!"
time.sleep(2)
Je modifier sys.__stdout__
directement parce que quand vous regardez la source curses/__init__.py
vous voyez que la fonction initscr
passe ce descripteur de fichier au code C et je stocke que pour être remis à zéro à la normale.
manière plus claire:
import sys
import curses
correct_stdout = sys.stdout # remember correct
curses.initscr()
curses.endwin()
sys.stdout = correct_stdout # restore correct
J'ai trouvé que tis est le système / dépend de la bibliothèque. Sur ma machine Windows (Curses du http://www.lfd.uci.edu/~ Gohlke / pythonlibs / ) il débusque et dort, mais sur Linux, il débusque après le sommeil. Je pense que vous pouvez simplement utiliser: sys.stdout.flush()
comme:
print "Hello world!"
sys.stdout.flush()
time.sleep(5)
(il peut être préférable de faire une sorte de fonction « impression et flush »)