Специальная оболочка оператора печати в python для игнорирования сообщений об ошибках или об ошибках

#python #filter #printing #stdout #with-statement

Вопрос:

Я надеялся создать оболочку python, чтобы поймать и выбросить определенный текст, который был сгенерирован библиотекой, которую я использую, и от которого я не смог избавиться обычным способом, т. Е.

 import sys
from contextlib import redirect_stdout

class PrintFilter:
    def __init__(self, stream, substring):
        self.stream = stream
        self.substring = substring

    def write(self, txt):
        if self.substring not in txt:
            self.stream.write(txt)

my_filter = PrintFilter(stream=sys.stdout, substring="substring")
with redirect_stdout(my_filter):
    result = f()
 

Я действительно заставил его прекратить печать, выполнив

 { python my_program.py 2>amp;1; } | grep -v "string-to-ignore"
 

Однако это немного неоптимально, так как это затрудняет игнорирование нескольких строк. Есть ли простой способ обернуть мою основную функцию внутрь my_program.py аналогично функции оболочки, представленной выше?

Комментарии:

1. Извините за непонимание, но в чем проблема с вашим решением?

2. Это { python my_program.py 2>amp;1; } | grep -v "string-to-ignore" работает, однако я не хочу оборачивать все программы, использующие эту библиотеку, каждый раз, когда я запускаю функцию, которая обращается к ней. Вместо этого я хотел бы иметь возможность сделать что-то, что я могу добавить в свой скрипт python, который делает это автоматически. Если это вообще поможет, библиотека, создающая кучу инструкций, — это pygame, которая не использует печать, а вместо этого использует какой-то тип ведения журнала. Более того, вместо направления сообщений в stdout, он направляет их в stderr.

Ответ №1:

Просто измените свой PrintFilter класс, чтобы при создании экземпляра он принимал список строк, а не одну строку. Затем повторите этот список, решая, следует ли опустить сообщение.

PS: Должно быть, я упускаю важную деталь в вашем вопросе, так как решение кажется тривиальным. Возможно, вам нужно переформулировать свой вопрос.