File size: 1,282 Bytes
c29babb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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)