Python 在诅咒模式下,stdout和stderr去哪里?
当诅咒激活时,stdout和stderr去哪里Python 在诅咒模式下,stdout和stderr去哪里?,python,ncurses,curses,Python,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) 实际产量为 stdout stderr stdout stderr std
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
stdout
stderr
stdout
stderr
更新0
预期产量为
stdout
stderr
stdout
stderr
stdout
stderr
进入并退出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
一秒钟(在睡眠期间)——它覆盖了stdout部分——然后它消失了,您可以在现在静止的屏幕上看到四行前后行(如果您愿意,您可以添加其他睡眠来跟踪发生的更多细节).关于这些流的输出将流向何处,您能说些什么?据我所知,stderr被“忽略”,stdout与终端指令交织在一起,我猜如果你转储到其中任何一个,它的终端取决于数据的用途/去向?@Matt,在Mac和Linux上,使用上面给出的代码,我会在一个空字符串上看到“wrap stderr”一秒钟,所以我不知道你为什么说stderr被“忽略”。它们都应该去之前去的地方,即/dev/tty(您可能需要刷新它们,因为它们的缓冲状态可能已临时更改,具体取决于您的操作系统和库)。注意:curses库不会保存当前屏幕内容;如果存在此类beast,它将默认切换到备用屏幕(终端术语:),并在退出时切换回正常屏幕。如果终端(实际上是terminfo数据)没有备用屏幕,curses只会清除屏幕。比较运行在例如/usr/bin/xterm
(或某个最近的终端)和/usr/bin/screen
(其中虚拟终端“screen”不提供备用屏幕)下的curses程序。我刚刚写了一篇非常混乱的评论,但我不能这样做:)切换屏幕的terminfo条目是:smcup
(^[-1049h
通常)和rmcup
(^[-1049l
)。可以通过向shell发出tput smcup
和tput rmcup
在屏幕之间手动切换。