2013-10-26 78 views
0

我用Python curses來開發一個界面。由於它在開發中,它崩潰了很多,並在stdoutstderr上拋出隨機錯誤。Curses,行尾壞了

輸出格式不正確;應該看起來像一個錯誤:

Error in line 100: 
Exception foo 
called from bar 

的樣子:

Error in line 100: 
        Exception foo 
           called from bar 

因此很明顯,\n不理解,因爲它應該(看起來像它期待\r)。我通過將stderr重定向到文件或其他終端來解決這個問題,但它可以在代碼中修復嗎?

編輯

這是我的代碼( 「包裝」 的一部分,圍繞詛咒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

聽起來像是你不使用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')但是,我認爲您只是想在程序在崩潰時退出時正確地讀取錯誤。

再次編輯: 更新了包裝示例以匹配您發佈的示例。

+0

我正在使用包裝。我不想手動發出'\ r \ n',因爲這些代碼應該與POSIX和Windows兼容 –

+0

@JakubM。你使用pdcurses還是其他?詛咒本身只是POSIX,'\ r \ n'不應該限制平臺。另外,如果你使用的是包裝器,那麼它不會正確地調用'curses.endwin()'。你可以發佈一個最小的例子,打印不正確使用包裝? – kalhartt

+0

我編輯了問題並添加了包裝調用。我沒有添加格式不正確的輸出,因爲它產生了很長的行數,所以沒有正確顯示它們。 –