Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在诅咒模式下,stdout和stderr去哪里?_Python_Ncurses_Curses - Fatal编程技术网

Python 在诅咒模式下,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

当诅咒激活时,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
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
在屏幕之间手动切换。