39 lines
1.2 KiB
Python
39 lines
1.2 KiB
Python
|
import os
|
||
|
import sys
|
||
|
|
||
|
|
||
|
class suppress_stdout_stderr(object):
|
||
|
# Oddly enough this works better than the contextlib version
|
||
|
def __enter__(self):
|
||
|
self.outnull_file = open(os.devnull, "w")
|
||
|
self.errnull_file = open(os.devnull, "w")
|
||
|
|
||
|
self.old_stdout_fileno_undup = sys.stdout.fileno()
|
||
|
self.old_stderr_fileno_undup = sys.stderr.fileno()
|
||
|
|
||
|
self.old_stdout_fileno = os.dup(sys.stdout.fileno())
|
||
|
self.old_stderr_fileno = os.dup(sys.stderr.fileno())
|
||
|
|
||
|
self.old_stdout = sys.stdout
|
||
|
self.old_stderr = sys.stderr
|
||
|
|
||
|
os.dup2(self.outnull_file.fileno(), self.old_stdout_fileno_undup)
|
||
|
os.dup2(self.errnull_file.fileno(), self.old_stderr_fileno_undup)
|
||
|
|
||
|
sys.stdout = self.outnull_file
|
||
|
sys.stderr = self.errnull_file
|
||
|
return self
|
||
|
|
||
|
def __exit__(self, *_):
|
||
|
sys.stdout = self.old_stdout
|
||
|
sys.stderr = self.old_stderr
|
||
|
|
||
|
os.dup2(self.old_stdout_fileno, self.old_stdout_fileno_undup)
|
||
|
os.dup2(self.old_stderr_fileno, self.old_stderr_fileno_undup)
|
||
|
|
||
|
os.close(self.old_stdout_fileno)
|
||
|
os.close(self.old_stderr_fileno)
|
||
|
|
||
|
self.outnull_file.close()
|
||
|
self.errnull_file.close()
|