Domanda

Ho un programma che utilizza maledizioni, e poi ritorna script principale per l'ulteriore elaborazione. Dopo ritorna, la mia successiva uscita a stdout non sembra fino a quando c'è una grande quantità di esso (ad esempio migliaia di byte).

Ho ridotto il problema ad un programma molto semplice che non riesce in modo affidabile:

import curses
import time

curses.initscr()
curses.endwin()

print "Hello world!"
time.sleep(5)

Se io commento le due chiamate maledizioni, il 'mondo Ciao!' stampe prima che il ritardo. Se li ho messi in, stampa dopo il ritardo (quando lo script si chiude).

È stato utile?

Soluzione

La chiamata curses.endwin() "rimette standard di I / O alla normalità" ... che purtroppo significa "tamponata" (si potrebbe prendere in considerazione che un bug nella curses e file il bug su inseguitore di Python).

Per garantire standard di uscita è unbuffered,

import os

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

(È possibile inserire il import os alla partenza, o il corso, la riassegnazione di sys.stdout è destinata ad andare a destra dopo la chiamata endwin).

Altri suggerimenti

Alex mi ha battuto ad esso (sapeva, ho dovuto capirlo), ma ho scritto questo manager contesto nifty che si potrebbe essere in grado di utilizzare.

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)

I modificare sys.__stdout__ direttamente, perché quando si guarda alla fonte in curses/__init__.py si vede che la funzione initscr passa che descrittore di file per il codice C e così ho negozio che per essere ripristinato alla normalità.

modo più chiaro:

import sys
import curses

correct_stdout = sys.stdout    # remember correct

curses.initscr()
curses.endwin()

sys.stdout = correct_stdout    # restore correct

Ho scoperto che è TIS Sistema / Libreria dipendente. Sulla mia macchina Windows (maledizioni da http://www.lfd.uci.edu/~ Gohlke / pythonlibs / ) svuota e poi dorme, ma su Linux svuota dopo il sonno. Penso che si può utilizzare semplicemente: sys.stdout.flush() come:

print "Hello world!"
sys.stdout.flush()
time.sleep(5)

(può essere meglio per fare qualche tipo di funzione "print & flush")

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top