質問

呪いを使用するプログラムがあり、さらに処理するためにメインスクリプトに戻ります。戻った後、STDOUTへのその後の出力は、大量の(数千バイト)があるまで表示されません。

問題を確実に失敗する非常に単純なプログラムに減らしました。

import curses
import time

curses.initscr()
curses.endwin()

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

2つの呪いの呼び出しにコメントすると、「Hello World!」遅延前に印刷します。私がそれらを入れた場合、それは遅延後(スクリプトが終了するとき)後に印刷します。

役に立ちましたか?

解決

curses.endwin() 「標準I/Oを通常に戻す」と呼ぶ...これは残念ながら「バッファリング」を意味します(あなたはそのバグを考慮することができます curses Pythonのトラッカーにバグを提出します)。

標準出力がバッファーされていないことを確認するために、

import os

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

(あなたは置くことができます import os 開始時、またはコース。の再割り当て sys.stdout その直後に行くことを意図しています endwin 電話)。

他のヒント

アレックスは私を打ち負かしました(彼は知っていました、私はそれを理解しなければなりませんでした)が、私はあなたが使用できるかもしれないこの気の利いたコンテキストマネージャーを書きました。

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)

変更します sys.__stdout__ ソースを見ると直接 curses/__init__.py あなたはそれを見ます initscr 関数はそのファイル記述子にCコードに渡されるため、通常にリセットするように保存します。

より明確な方法:

import sys
import curses

correct_stdout = sys.stdout    # remember correct

curses.initscr()
curses.endwin()

sys.stdout = correct_stdout    # restore correct

TISはシステム/ライブラリに依存していることがわかりました。私のWindowsマシンで(呪いから http://www.lfd.uci.edu/~gohlke/pythonlibs/)それはフラッシュしてから眠りますが、Linuxでは睡眠後に紅潮します。単に使用できると思います。 sys.stdout.flush() お気に入り:

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

(ある種の「印刷&フラッシュ」機能を作る方が良いかもしれません)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top