Я хочу обработать вывод в реальном времени сценария третьей стороны, печатая некоторые строки, которые соответствуют шаблону, но пропуская другие:
def thirdparty_code():
from random import choice
stuff = ['keep: important stuff', 'ignore: boring stuff']
while True:
chosen_line = choice(stuff)
print(chosen_line)
Я использую redirect_stdout
(который передает строки в мой фиктивный ввод-вывод) ирасширенный StringIO
(который служит IO, но также вызывает мою функцию фильтрации).Однако, когда я вызываю print()
внутри своей функции обработки, я получаю RecursionError
- что не является неожиданным:
from io import StringIO
from contextlib import redirect_stdout
class StringIOWithCallback(StringIO):
def __init__(self, callback, **kwargs):
super().__init__(**kwargs)
self.callback = callback
def write(self, s):
super().write(s)
self.callback(s)
def filter_boring_stuff_out(line):
if line.startswith('ignore'):
return
print(line)
my_io = StringIOWithCallback(filter_boring_stuff_out)
with redirect_stdout(my_io):
thirdparty_code()
Интересно, можно ли выйти из перенаправления, например, указав *Параметр 1011 * в функции print()
позволяет печатать на фактическом стандартном выходе.Я знаю, что могу легко использовать стандартный поток ошибок:
import sys
print(line, file=sys.stderr)
Но я специально хочу использовать стандартный вывод.Есть ли хороший, питонный способ сделать это?