4

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

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

import curses
import time

curses.initscr()
curses.endwin()

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

2 つの curses 呼び出しをコメント アウトすると、「Hello world!」遅れる前に印刷します。それらを入れると、遅延後(スクリプトが終了したとき)に印刷されます。

4

4 に答える 4

3

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

標準出力がバッファリングされないようにするには、

import os

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

import os(を最初またはコースに置くことができます。 の再割り当てはsys.stdout、呼び出しの直後に行うことを意図していendwinます)。

于 2010-09-14T04:55:06.417 に答える
1

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

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コードに渡していることがわかり、それを保存して通常にリセットするため、直接変更します。

于 2010-09-14T05:03:46.583 に答える
0

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

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

(なんらかの「print & flush」機能を作ったほうがいいかもしれません)

于 2010-09-14T05:00:59.643 に答える