我正在构建一个python curses应用程序。
我有两种方法可以打印到curses窗口:print x
和windows.addstr(x)
(以及其他类似的window.*
选项)。
但是,出于调试目的,我希望能够打印到标准控制台,所以当我退出curses窗口时,我有等待我的信息。我通常只使用print x
,但会打印到curses窗口。
sys.stout.write()
也失败了。
我该怎么做?
在sys.stdout
之后使用os.fdopen
后,这是追溯
curses.nocbreak()
_curses.error: nocbreak() returned ERR
close failed in file object destructor:
sys.excepthook is missing
lost sys.stderr
答案 0 :(得分:8)
如你所说,这是我使用的片段:
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())
这个技巧的巧妙之处在于,您还可以在小部件的ncurse运行时期间输出stdout。当然,StdOutWrapper的内部表示可以根据需要进行调整,以更好地满足您的需求。
答案 1 :(得分:1)
为什么不使用标准logging
模块?
将它与curses.wrapper
结合使用,你很高兴
修改强>
您可以在此处查看示例: https://stackoverflow.com/a/28102809/26494
如果您只想登录文件:
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)