我使用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()
答案 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')
但是我假设您只是想在程序崩溃时正确读取错误。
再次编辑: 更新了包装示例以匹配您发布的示例。