在curses模式下stdout和stderr去哪了?

7 投票
1 回答
4343 浏览
提问于 2025-04-15 19:05

当使用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

更新0

预期的输出是

stdout
stderr
stdout
stderr

进入curses模式,然后退出时,终端中显示的最终文本没有变化。

1 个回答

7

激活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")

你会注意到屏幕上会出现wrap stderr,持续一秒钟(在休眠期间)——它覆盖了标准输出的部分——然后它消失了,你会看到屏幕上之前和之后的四行内容(如果你想更详细地跟踪发生了什么,可以添加其他的休眠时间)。

撰写回答