Skip to content

Instantly share code, notes, and snippets.

@msabramo
Last active August 10, 2018 09:35
Show Gist options
  • Save msabramo/6040400 to your computer and use it in GitHub Desktop.
Save msabramo/6040400 to your computer and use it in GitHub Desktop.
A context manager to temporarily redirect stdout or stderr e.g.: ```python with stdchannel_redirected(sys.stderr, os.devnull): ... ```
import contextlib
@contextlib.contextmanager
def stdchannel_redirected(stdchannel, dest_filename):
"""
A context manager to temporarily redirect stdout or stderr
e.g.:
with stdchannel_redirected(sys.stderr, os.devnull):
if compiler.has_function('clock_gettime', libraries=['rt']):
libraries.append('rt')
"""
try:
oldstdchannel = os.dup(stdchannel.fileno())
dest_file = open(dest_filename, 'w')
os.dup2(dest_file.fileno(), stdchannel.fileno())
yield
finally:
if oldstdchannel is not None:
os.dup2(oldstdchannel, stdchannel.fileno())
if dest_file is not None:
dest_file.close()
@msabramo
Copy link
Author

Sample usage:

with stdchannel_redirected(sys.stderr, os.devnull):
    if compiler.has_function('clock_gettime', libraries=['rt']):
        libraries.append('rt')

Used in the setup.py of pymssql: https://code.google.com/p/pymssql/source/detail?r=dff75e59fde5c814e160b973ba94496f1b033499#

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment