Source code for stouputils.ctx.muffle
# Imports
from __future__ import annotations
import os
import sys
from typing import IO, Any
from .common import AbstractBothContextManager
# Context manager to temporarily silence output
[docs]
class Muffle(AbstractBothContextManager["Muffle"]):
""" Context manager that temporarily silences output.
(No thread-safety guaranteed)
Alternative to :py:deco:`~stouputils.decorators.silent`
Examples:
>>> with Muffle():
... print("This will not be printed")
"""
def __init__(self, mute_stderr: bool = False) -> None:
self.mute_stderr: bool = mute_stderr
""" Attribute remembering if stderr should be muted """
self.original_stdout: IO[Any]
""" Attribute remembering original stdout """
self.original_stderr: IO[Any]
""" Attribute remembering original stderr """
def __enter__(self) -> Muffle:
""" Enter context manager which redirects stdout and stderr to devnull """
# Redirect stdout to devnull
self.original_stdout = sys.stdout
sys.stdout = open(os.devnull, "w", encoding="utf-8")
# Redirect stderr to devnull if needed
if self.mute_stderr:
self.original_stderr = sys.stderr
sys.stderr = open(os.devnull, "w", encoding="utf-8")
# Return self
return self
def __exit__(self, exc_type: type[BaseException]|None, exc_val: BaseException|None, exc_tb: Any|None) -> None:
""" Exit context manager which restores original stdout and stderr """
# Restore original stdout
sys.stdout.close()
sys.stdout = self.original_stdout
# Restore original stderr if needed
if self.mute_stderr:
sys.stderr.close()
sys.stderr = self.original_stderr
async def __aenter__(self) -> Muffle:
""" Enter async context manager which redirects stdout and stderr to devnull """
return self.__enter__()
async def __aexit__(self, exc_type: type[BaseException]|None, exc_val: BaseException|None, exc_tb: Any|None) -> None:
""" Exit async context manager which restores original stdout and stderr """
self.__exit__(exc_type, exc_val, exc_tb)