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

Mat*_*ner 6 python curses ncurses

当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)
Run Code Online (Sandbox Code Playgroud)

实际输出是

stdout
stderr
Run Code Online (Sandbox Code Playgroud)

Update0

预期的产出是

stdout
stderr
stdout
stderr
Run Code Online (Sandbox Code Playgroud)

进入,然后退出curses模式,不更改终端中显示的最终文本.

Ale*_*lli 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")
Run Code Online (Sandbox Code Playgroud)

你会wrap stderr在屏幕上注意一秒钟(在睡眠期间) - 它被覆盖了stdout部分 - 然后它消失了,你会在现在静止的屏幕上看到前后四行(你可以添加其他睡眠到如果您愿意,请关注更多细节中发生的事情.

  • 注意:curses 库不保存当前屏幕内容;它默认切换到备用屏幕(终端术语:) *如果*存在这样的野兽,并在退出时切换回正常屏幕。如果终端(实际上是 terminfo 数据)没有备用屏幕,curses 只会清除屏幕。比较在例如“/usr/bin/xterm”(或某些最近的终端)和“/usr/bin/screen”(其中虚拟终端“screen”不提供备用屏幕)下运行的curses 程序。我刚刚写了一条非常混乱的评论,但我别无选择:) (2认同)
  • 切换屏幕的 terminfo 条目是:“smcup”(通常为“^[[?1049h”)和“rmcup”(“^[[?1049l”)。可以通过向 shell 发出“tput smcup”和“tput rmcup”来手动在屏幕之间切换。 (2认同)