1

我使用Python curses来开发一个接口。由于它正在开发中,它经常崩溃并在stdout或上抛出随机错误stderr

输出格式不正确;应该如下所示的错误:

Error in line 100:
Exception foo
called from bar

好像:

Error in line 100:
                  Exception foo
                               called from bar

所以显然\n没有被解释为它应该的(看起来像它期望的那样\r)。我通过重定向stderr到文件或其他终端来处理这个问题,但它可以在代码中修复吗?

编辑

这是我的代码片段(curses UI 的“包装器”的一部分)

class CursesUI(object):
#...
def _setup(self):
    stdscr = curses.initscr()
    stdscr.keypad(1)
    curses.noecho()
    curses.cbreak()
    curses.curs_set(0)
    return stdscr

def _restore(self):
    # called on close()
    self._stdscr.keypad(0)
    curses.echo()
    curses.nocbreak()
    curses.curs_set(1)
    curses.endwin()
4

1 回答 1

0

听起来你没有使用curses.wrapper

相比

class MyApp:
    def __init__(self, stdscr):
        raise Exception('Arggh')

if __name__ == '__main__':
    curses.wrapper(MyApp)        # This will print your error properly
    # MyApp(curses.initscr())    # This gives the behavior you see

您发布的示例未显示如何调用_setup_restore调用。您必须确保在使用块打印回溯之前close调用了or_restore方法。try:... finally:...

class CursesUI(object):
    def __init__(self):
        try:
            self._stdscr = self._setup()
            self.main()
        finally:
            self._restore()

    def main(self):
        curses.napms(500)
        raise Exception('Arggh')

使用您的_setup_restore方法,这将正确打印回溯。

编辑:

至于期待回车,你是正确\n的被解释为向下移动一列并\r返回到行开头。因此,如果您手动打印,您可以使用sys.stdout.write('msg\r\n')但是我假设您只想在程序因崩溃而退出时正确读取错误。

再次编辑:更新了包装示例以匹配您发布的示例。

于 2013-10-27T00:37:24.380 回答