首页 > 解决方案 > Jupyter 笔记本输出重定向

问题描述

我想重定向笔记本每个单元格的输出。这是我尝试过的

class Logger():
    def __init__(self, stdout):
        self.stdout = stdout

    def write(self, msg):
        self.stdout.write('augmented:' + msg)

    def flush(self):
        self.stdout.flush() 

在一个牢房里,我stdout在飞行中改变

sys.stdout = Logger(sys.stdout)

但是,下一个执行单元的输出字符串没有“增强”字符串

标签: pythonjupyter-notebookstdout

解决方案


您可以使用contextlib.

from contextlib import contextmanager
import sys
@contextmanager
def stdout_redirector():
    class MyStream:
        def write(self, msg):
            prefix = 'augmented:' if msg.strip() else ''
            old_stdout.write( prefix + msg)
        def flush(self):
            old_stdout.flush()
    old_stdout = sys.stdout
    sys.stdout = MyStream()
    try:
        yield
    finally:
        sys.stdout = old_stdout

输出

最好使用with语句来管理重定向。如果这在您的情况下是不可能的,那么调用重定向器对象的__enter__()and方法也可以。__exit__()您还可以将这些重定向器代码放在IPython的pre_run_cellandpost_run_cell 钩子函数中。


推荐阅读