#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: Должно быть, я упускаю важную деталь в вашем вопросе, так как решение кажется тривиальным. Возможно, вам нужно переформулировать свой вопрос.