9

我正在构建一个 python 诅咒应用程序。

我有两种打印到 curses 窗口的方法:print xwindows.addstr(x)(以及其他类似window.*选项)。

但是,出于调试目的,我希望能够打印到标准控制台,所以当我退出 curses 窗口时,我有信息等着我看到。我通常只会使用print x,但会打印到 curses 窗口。

sys.stout.write()也失败了。

我怎样才能做到这一点?

使用sys.stdoutafter 后os.fdopen,这是回溯

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

2 回答 2

11

按照你说的做,这是我使用的一个片段:

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 运行时输出您的标准输出。当然,可以根据需要调整 StdOutWrapper 的内部表示,以更好地满足您的需求。

于 2012-12-23T12:30:09.597 回答
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)
于 2014-06-04T11:33:45.903 回答