Я пытаюсь подавить sys.stdout из печати на консоль с помощью диспетчера асинхронного контекста, если включен «режим слияния» True.
Код для возврата sys.stdout в исходное состояние иногда выполняется до того, как все задачи завершены.Иногда он также не выводится на консоль после сброса sys.stdout.
Я пробовал несколько разных подходов, и следующий код, похоже, помогает.Я посчитал оставшиеся задачи, которые нужно было выполнить, прежде чем я должен сбросить sys.stdout и проверить, сколько именно задач все еще выполняется.
Но я не думаю, что это хорошее решение проблемы, оно может вызвать слишком много проблем в будущем, добавляя больше функций в код.
class SilentMode():
def __init__(self, silent_mode: bool):
self.silent_mode = silent_mode
self.orginal_stdout = sys.stdout
async def __aenter__(self) -> None:
if self.silent_mode:
sys.stdout = open(os.devnull, 'w')
async def __aexit__(self, exc_type, exc_val, exc_tb) -> None:
if self.silent_mode:
sys.stdout.flush()
while len(asyncio.all_tasks()) > 3:
await asyncio.sleep(.1)
sys.stdout = self.orginal_stdout
Вот репозиторий GitHub с остальным кодом для справки.