public release 4.2.0 - see README.md and CHANGES.md for details
This commit is contained in:
@@ -6,6 +6,13 @@ a collection of small and generic code bits mostly collected from the www.
|
||||
|
||||
"""
|
||||
|
||||
import contextlib
|
||||
import ctypes
|
||||
import io
|
||||
import os
|
||||
import sys
|
||||
from typing import BinaryIO
|
||||
|
||||
|
||||
class BraceMessage(object):
|
||||
"""
|
||||
@@ -22,3 +29,40 @@ class BraceMessage(object):
|
||||
|
||||
def __str__(self):
|
||||
return self.fmt.format(*self.args, **self.kwargs)
|
||||
|
||||
|
||||
libc = ctypes.CDLL(None)
|
||||
c_stdout = ctypes.c_void_p.in_dll(libc, 'stdout')
|
||||
|
||||
|
||||
@contextlib.contextmanager
|
||||
def stdout_redirected(dest_file: BinaryIO):
|
||||
"""
|
||||
A context manager to temporarily redirect stdout to a file.
|
||||
|
||||
Redirects all standard output from Python and the C library to the specified file.
|
||||
This can be used, e.g., to capture output from Fortran code.
|
||||
|
||||
credit: https://eli.thegreenplace.net/2015/redirecting-all-kinds-of-stdout-in-python/
|
||||
|
||||
@param dest_file: binary file open for writing ('wb' mode).
|
||||
This function requires just the fileno function.
|
||||
@return: None
|
||||
"""
|
||||
|
||||
original_stdout_fd = sys.stdout.fileno()
|
||||
|
||||
def _redirect_stdout(to_fd):
|
||||
"""Redirect stdout to the given file descriptor."""
|
||||
libc.fflush(c_stdout)
|
||||
sys.stdout.close()
|
||||
os.dup2(to_fd, original_stdout_fd)
|
||||
sys.stdout = io.TextIOWrapper(os.fdopen(original_stdout_fd, 'wb'))
|
||||
|
||||
saved_stdout_fd = os.dup(original_stdout_fd)
|
||||
try:
|
||||
_redirect_stdout(dest_file.fileno())
|
||||
yield
|
||||
_redirect_stdout(saved_stdout_fd)
|
||||
finally:
|
||||
os.close(saved_stdout_fd)
|
||||
|
||||
Reference in New Issue
Block a user