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
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.
Why don't you use the standard logging
module?
Combine it with curses.wrapper
, and you are good to go
EDIT:
You can see example here: https://stackoverflow.com/a/28102809/26494
If you just want to log to file:
import logging
import curses
def draw(stdscr):
logger = logging.getLogger(__file__)
hdlr = logging.FileHandler(__file__ + ".log")
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
hdlr.setFormatter(formatter)
logger.addHandler(hdlr)
logger.setLevel(logging.DEBUG)
logger.info("begin")
curses.init_pair(1, curses.COLOR_CYAN, curses.COLOR_BLACK)
stdscr.addstr(0, 0, 'hello', curses.color_pair(1))
logger.info("yeah")
stdscr.getch()
logger.info("end")
if __name__ == '__main__':
curses.wrapper(draw)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With