Вы можете временно перенаправить stdout
на выбранный вами объект. В приведенном ниже примере хранятся напечатанные данные в экземпляре StringIO
. Как только блок диспетчера контекста заканчивается, нормальная печать возобновляется и позволяет отображать некоторую отладочную информацию:
#! /usr/bin/env python3
import contextlib
import io
def main():
file = io.StringIO()
with contextlib.redirect_stdout(file):
print('a')
print('b')
print('c')
print(f'{file!r}\n{file.getvalue()!r}\n{file.getvalue()!s}')
if __name__ == '__main__':
main()
Приложение:
Если вы используете sh для использования stdout
Как обычно и по-прежнему захватывать то, что напечатано на нем, вы можете вместо этого использовать следующий пример. Класс Apply
может обернуть несколько экземпляров и дублировать вызовы методов для всех них. Поэтому вызов redirect_stdout
был немного изменен:
#! /usr/bin/env python3
import contextlib
import io
import sys
def main():
file = io.StringIO()
with contextlib.redirect_stdout(Apply(sys.stdout, file)):
print('a')
print('b')
print('c')
print(f'{file!r}\n{file.getvalue()!r}\n{file.getvalue()!s}')
class Apply:
def __init__(self, *args):
self.__objects = args
def __getattr__(self, name):
attr = _Attribute(getattr(obj, name) for obj in self.__objects)
setattr(self, name, attr)
return attr
class _Attribute:
def __init__(self, iterable):
self.__attributes = tuple(filter(callable, iterable))
def __call__(self, *args, **kwargs):
return [attr(*args, **kwargs) for attr in self.__attributes]
if __name__ == '__main__':
main()