6

curses がアクティブな場合、stdout と stderr はどこに行きますか?

import curses, sys

def test_streams():
    print "stdout"
    print >>sys.stderr, "stderr"

def curses_mode(stdscr):
    test_streams()

test_streams()
curses.wrapper(curses_mode)

実際の出力は

stdout
stderr

Update0

期待される出力は

stdout
stderr
stdout
stderr

端末に表示される最終的なテキストを変更せずに、curses モードに入ってから終了します。

4

1 に答える 1

5

cursesをアクティブにすると、ターミナルテキスト画面の現在の内容が保存され、その画面がクリアされます。cursesを終了すると、画面の内容が復元されます(curses自体の統治中に画面に表示されたものはすべて破棄されます)。コードのこのバリアントを試してみると、何が起こっているのかがよくわかります。

import curses, sys, time

def test_streams(wot):
    print wot, "stdout"
    print >>sys.stderr, wot, "stderr"

def curses_mode(stdscr):
    test_streams("wrap")
    time.sleep(1.0)

test_streams("before")
curses.wrapper(curses_mode)
test_streams("after")

画面に1秒間(スリープ中)(stdout部分が上書きされます)が表示されます。wrap stderrその後、画面が消え、静止状態の画面に前後の4行が表示されます(他のスリープを追加できます)。気になる場合は、さらに詳細に何が起こっているかに従ってください)。

于 2010-02-10T04:26:35.753 に答える