GenD-Sentinel / src /utils /silencer.py
yermandy's picture
init
c29babb
import os
import sys
from contextlib import contextmanager
@contextmanager
def silenced_output():
"""
A context manager to suppress all stdout and stderr,
including from C-level libraries.
"""
# Open a null file descriptor
devnull_fd = os.open(os.devnull, os.O_RDWR)
# Save the original stdout and stderr file descriptors
original_stdout_fd = sys.stdout.fileno()
original_stderr_fd = sys.stderr.fileno()
# Duplicate the original file descriptors to save them
saved_stdout_fd = os.dup(original_stdout_fd)
saved_stderr_fd = os.dup(original_stderr_fd)
try:
# Redirect Python's stdout/stderr file descriptors
# to the null device
sys.stdout.flush()
sys.stderr.flush()
os.dup2(devnull_fd, original_stdout_fd)
os.dup2(devnull_fd, original_stderr_fd)
# Yield control back to the 'with' block
yield
finally:
# Restore the original stdout/stderr from the saved FDs
sys.stdout.flush()
sys.stderr.flush()
os.dup2(saved_stdout_fd, original_stdout_fd)
os.dup2(saved_stderr_fd, original_stderr_fd)
# Close the temporary FDs
os.close(saved_stdout_fd)
os.close(saved_stderr_fd)
os.close(devnull_fd)