LSST Applications 27.0.0,g0265f82a02+469cd937ee,g02d81e74bb+21ad69e7e1,g1470d8bcf6+cbe83ee85a,g2079a07aa2+e67c6346a6,g212a7c68fe+04a9158687,g2305ad1205+94392ce272,g295015adf3+81dd352a9d,g2bbee38e9b+469cd937ee,g337abbeb29+469cd937ee,g3939d97d7f+72a9f7b576,g487adcacf7+71499e7cba,g50ff169b8f+5929b3527e,g52b1c1532d+a6fc98d2e7,g591dd9f2cf+df404f777f,g5a732f18d5+be83d3ecdb,g64a986408d+21ad69e7e1,g858d7b2824+21ad69e7e1,g8a8a8dda67+a6fc98d2e7,g99cad8db69+f62e5b0af5,g9ddcbc5298+d4bad12328,ga1e77700b3+9c366c4306,ga8c6da7877+71e4819109,gb0e22166c9+25ba2f69a1,gb6a65358fc+469cd937ee,gbb8dafda3b+69d3c0e320,gc07e1c2157+a98bf949bb,gc120e1dc64+615ec43309,gc28159a63d+469cd937ee,gcf0d15dbbd+72a9f7b576,gdaeeff99f8+a38ce5ea23,ge6526c86ff+3a7c1ac5f1,ge79ae78c31+469cd937ee,gee10cc3b42+a6fc98d2e7,gf1cff7945b+21ad69e7e1,gfbcc870c63+9a11dc8c8f
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: