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).

Était-ce utile?

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 »)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top