Search code examples
pythonncursescurses

Print to standard console in curses


I'm building a python curses application.

I have two ways of printing to the curses window: print x, and windows.addstr(x) (and the other similar window.* options).

However, for debugging purposes, I'd like to be able to print to the standard console, so when I exit the curses window, I have the infomation waiting for me to be seen. I would normally just use print x, but that prints to the curses window.

sys.stout.write() also fails.

How can I do this?

After using sys.stdout after os.fdopen, this is the traceback

 curses.nocbreak()
 _curses.error: nocbreak() returned ERR
 close failed in file object destructor:
 sys.excepthook is missing
 lost sys.stderr

Solution

  • To do as you say, here is a snippet I used:

    class StdOutWrapper:
        text = ""
        def write(self,txt):
            self.text += txt
            self.text = '\n'.join(self.text.split('\n')[-30:])
        def get_text(self,beg,end):
            return '\n'.join(self.text.split('\n')[beg:end])
    
    if __name__ == "__main__":
        mystdout = StdOutWrapper()
        sys.stdout = mystdout
        sys.stderr = mystdout
    
        screen = curses.initscr()
        curses.noecho()
        curses.cbreak()
    
        # do your stuff here
        # you can also output mystdout.get_text() in a ncurses widget in runtime
    
        screen.keypad(0)
        curses.nocbreak()
        curses.echo()
        curses.endwin()
        sys.stdout = sys.__stdout__
        sys.stderr = sys.__stderr__
        sys.stdout.write(mystdout.get_text())
    

    The neat thing with that trick, is that you can also output your stdout during ncurse runtime in a widget. Of course the internal representation of StdOutWrapper can be tweaked as you want, to better match your needs.