«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как динамически перенаправить стандартный вывод и потоки ошибок в функциях Python?

Как динамически перенаправить стандартный вывод и потоки ошибок в функциях Python?

Опубликовано 8 ноября 2024 г.
Просматривать:227

How to Dynamically Redirect Standard Output and Error Streams in Python Functions?

Перенаправление контекстного потока в 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