Перенаправление контекстного потока в Python
Перенаправление стандартного вывода и потоков ошибок (stdout и stderr) оказывается полезным во многих сценариях. Однако традиционные методы часто терпят неудачу, когда функция содержит внутреннюю ссылку на эти потоки.
Необходимость динамического решения
Традиционные методы перенаправления, такие как sys.stdout, перенаправить потоки навсегда. Эта проблема возникает, когда метод по своей сути копирует одну из этих переменных внутри себя. Следовательно, эти методы не могут правильно перенаправить потоки.
Решение: расширение диспетчера контекста
Для эффективного решения этой проблемы можно использовать подход диспетчера контекста. Этот метод включает в себя перенос логики перенаправления в контекстный менеджер:
import os
import sys
class RedirectStdStreams(object):
def __init__(self, stdout=None, stderr=None):
self._stdout = stdout or sys.stdout
self._stderr = stderr or sys.stderr
def __enter__(self):
self.old_stdout, self.old_stderr = sys.stdout, sys.stderr
self.old_stdout.flush(); self.old_stderr.flush()
sys.stdout, sys.stderr = self._stdout, self._stderr
def __exit__(self, exc_type, exc_value, traceback):
self._stdout.flush(); self._stderr.flush()
sys.stdout = self.old_stdout
sys.stderr = self.old_stderr
Используя этот менеджер контекста, вы можете легко перенаправлять потоки внутри блока контекста:
devnull = open(os.devnull, 'w')
print('Fubar')
with RedirectStdStreams(stdout=devnull, stderr=devnull):
print("You'll never see me")
print("I'm back!")
Заключение
Предлагаемое решение использует шаблон контекстного менеджера для временного перенаправления stdout и stderr, обходя ограничения предыдущих подходов . Этот метод оказывается особенно полезным при работе с функциями, имеющими локальные ссылки на эти потоки.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3