LSST Applications g0265f82a02+0e5473021a,g02d81e74bb+f5613e8b4f,g1470d8bcf6+190ad2ba91,g14a832a312+311607e4ab,g2079a07aa2+86d27d4dc4,g2305ad1205+a8e3196225,g295015adf3+b67ee847e5,g2bbee38e9b+0e5473021a,g337abbeb29+0e5473021a,g3ddfee87b4+a761f810f3,g487adcacf7+17c8fdbcbd,g50ff169b8f+96c6868917,g52b1c1532d+585e252eca,g591dd9f2cf+65b5bd823e,g5a732f18d5+53520f316c,g64a986408d+f5613e8b4f,g6c1bc301e9+51106c2951,g858d7b2824+f5613e8b4f,g8a8a8dda67+585e252eca,g99cad8db69+6729933424,g9ddcbc5298+9a081db1e4,ga1e77700b3+15fc3df1f7,ga8c6da7877+ef4e3a5875,gb0e22166c9+60f28cb32d,gb6a65358fc+0e5473021a,gba4ed39666+c2a2e4ac27,gbb8dafda3b+e9bba80f27,gc120e1dc64+eee469a5e5,gc28159a63d+0e5473021a,gcf0d15dbbd+a761f810f3,gdaeeff99f8+f9a426f77a,ge6526c86ff+d4c1d4bfef,ge79ae78c31+0e5473021a,gee10cc3b42+585e252eca,gf1cff7945b+f5613e8b4f,w.2024.16
LSST Data Management Base Package
Loading...
Searching...
No Matches
Public Member Functions | Protected Attributes | List of all members
lsst.log.utils.LogRedirect Class Reference

Public Member Functions

 __init__ (self, fd=1, dest=sys.stderr, encoding="utf-8", errors="strict")
 
 finish (self)
 

Protected Attributes

 _fd
 
 _dest
 
 _filehandle
 
 _thread
 

Detailed Description

Redirect a logging file descriptor to a Python stream.

Parameters
----------
fd : `int`
    File descriptor number, usually 1 for standard out, the default log
    output location.
dest : `io.TextIOBase`
    Destination text stream, often `sys.stderr` for ipython or Jupyter
    notebooks.
encoding : `str`
    Text encoding of the data written to fd.
errors : `str`
    Encoding error handling.

Notes
-----
Inspired by `this Stack Overflow answer
<https://stackoverflow.com/questions/41216215>`_

Definition at line 77 of file utils.py.

Constructor & Destructor Documentation

◆ __init__()

lsst.log.utils.LogRedirect.__init__ ( self,
fd = 1,
dest = sys.stderr,
encoding = "utf-8",
errors = "strict" )

Definition at line 99 of file utils.py.

99 def __init__(self, fd=1, dest=sys.stderr, encoding="utf-8", errors="strict"):
100 self._fd = fd
101 self._dest = dest
102 # Save original filehandle so we can restore it later.
103 self._filehandle = os.dup(fd)
104
105 # Redirect `fd` to the write end of the pipe.
106 pipe_read, pipe_write = os.pipe()
107 os.dup2(pipe_write, fd)
108 os.close(pipe_write)
109
110 # This thread reads from the read end of the pipe.
111 def consumer_thread(f, data):
112 while True:
113 buf = os.read(f, 1024)
114 if not buf:
115 break
116 data.write(buf.decode(encoding, errors))
117 os.close(f)
118 return
119
120 # Spawn consumer thread with the desired destination stream.
121 self._thread = threading.Thread(target=consumer_thread, args=(pipe_read, dest))
122 self._thread.start()
123

Member Function Documentation

◆ finish()

lsst.log.utils.LogRedirect.finish ( self)
Stop redirecting output.

Definition at line 124 of file utils.py.

124 def finish(self):
125 """Stop redirecting output.
126 """
127
128 # Cleanup: flush streams, restore `fd`
129 self._dest.flush()
130 # This dup2 closes the saved file descriptor, which is now the write
131 # end of the pipe, causing the thread's read to terminate
132 os.dup2(self._filehandle, self._fd)
133 os.close(self._filehandle)
134 self._thread.join()
135
136

Member Data Documentation

◆ _dest

lsst.log.utils.LogRedirect._dest
protected

Definition at line 101 of file utils.py.

◆ _fd

lsst.log.utils.LogRedirect._fd
protected

Definition at line 100 of file utils.py.

◆ _filehandle

lsst.log.utils.LogRedirect._filehandle
protected

Definition at line 103 of file utils.py.

◆ _thread

lsst.log.utils.LogRedirect._thread
protected

Definition at line 121 of file utils.py.


The documentation for this class was generated from the following file: