Перенаправление вывода с ноутбука Jupyter - PullRequest
0 голосов
/ 02 марта 2019

Я бы хотел перенаправить вывод каждой ячейки моего ноутбука.Вот что я пробовал

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)

Однако выходная строка следующих выполненных ячеек не имеет«дополненная» строка

1 Ответ

0 голосов
/ 02 марта 2019

Вы можете использовать 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

output

Для управления перенаправлением лучше использовать оператор with.Если это невозможно в вашем случае, вызов методов __enter__() и __exit__() объекта перенаправителя также работает.Вы также можете поместить эти коды перенаправителя в функции pre_run_cell и post_run_cell hook в IPython.

...