diff --git a/llama_cpp/utils.py b/llama_cpp/utils.py index c14f53f..91d8fd6 100644 --- a/llama_cpp/utils.py +++ b/llama_cpp/utils.py @@ -3,36 +3,42 @@ import sys class suppress_stdout_stderr(object): + # NOTE: these must be "saved" here to avoid exceptions when using + # this context manager inside of a __del__ method + open = open + sys = sys + os = os + # 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.outnull_file = self.open(self.os.devnull, "w") + self.errnull_file = self.open(self.os.devnull, "w") - self.old_stdout_fileno_undup = sys.stdout.fileno() - self.old_stderr_fileno_undup = sys.stderr.fileno() + self.old_stdout_fileno_undup = self.sys.stdout.fileno() + self.old_stderr_fileno_undup = self.sys.stderr.fileno() - self.old_stdout_fileno = os.dup(sys.stdout.fileno()) - self.old_stderr_fileno = os.dup(sys.stderr.fileno()) + self.old_stdout_fileno = self.os.dup(self.sys.stdout.fileno()) + self.old_stderr_fileno = self.os.dup(self.sys.stderr.fileno()) - self.old_stdout = sys.stdout - self.old_stderr = sys.stderr + self.old_stdout = self.sys.stdout + self.old_stderr = self.sys.stderr - os.dup2(self.outnull_file.fileno(), self.old_stdout_fileno_undup) - os.dup2(self.errnull_file.fileno(), self.old_stderr_fileno_undup) + self.os.dup2(self.outnull_file.fileno(), self.old_stdout_fileno_undup) + self.os.dup2(self.errnull_file.fileno(), self.old_stderr_fileno_undup) - sys.stdout = self.outnull_file - sys.stderr = self.errnull_file + self.sys.stdout = self.outnull_file + self.sys.stderr = self.errnull_file return self def __exit__(self, *_): - sys.stdout = self.old_stdout - sys.stderr = self.old_stderr + self.sys.stdout = self.old_stdout + self.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) + self.os.dup2(self.old_stdout_fileno, self.old_stdout_fileno_undup) + self.os.dup2(self.old_stderr_fileno, self.old_stderr_fileno_undup) - os.close(self.old_stdout_fileno) - os.close(self.old_stderr_fileno) + self.os.close(self.old_stdout_fileno) + self.os.close(self.old_stderr_fileno) self.outnull_file.close() self.errnull_file.close()