诅咒,行尾破碎

时间:2013-10-26 22:46:56

标签: python python-2.7 ncurses curses python-curses

我使用Python curses开发界面。在开发过程中,它会崩溃很多,并在stdoutstderr上抛出随机错误。

输出格式不正确;一个看起来像的错误:

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()

1 个答案:

答案 0 :(得分: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_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')但是我假设您只是想在程序崩溃时正确读取错误。

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