LSST Applications  21.0.0-172-gfb10e10a+18fedfabac,22.0.0+297cba6710,22.0.0+80564b0ff1,22.0.0+8d77f4f51a,22.0.0+a28f4c53b1,22.0.0+dcf3732eb2,22.0.1-1-g7d6de66+2a20fdde0d,22.0.1-1-g8e32f31+297cba6710,22.0.1-1-geca5380+7fa3b7d9b6,22.0.1-12-g44dc1dc+2a20fdde0d,22.0.1-15-g6a90155+515f58c32b,22.0.1-16-g9282f48+790f5f2caa,22.0.1-2-g92698f7+dcf3732eb2,22.0.1-2-ga9b0f51+7fa3b7d9b6,22.0.1-2-gd1925c9+bf4f0e694f,22.0.1-24-g1ad7a390+a9625a72a8,22.0.1-25-g5bf6245+3ad8ecd50b,22.0.1-25-gb120d7b+8b5510f75f,22.0.1-27-g97737f7+2a20fdde0d,22.0.1-32-gf62ce7b1+aa4237961e,22.0.1-4-g0b3f228+2a20fdde0d,22.0.1-4-g243d05b+871c1b8305,22.0.1-4-g3a563be+32dcf1063f,22.0.1-4-g44f2e3d+9e4ab0f4fa,22.0.1-42-gca6935d93+ba5e5ca3eb,22.0.1-5-g15c806e+85460ae5f3,22.0.1-5-g58711c4+611d128589,22.0.1-5-g75bb458+99c117b92f,22.0.1-6-g1c63a23+7fa3b7d9b6,22.0.1-6-g50866e6+84ff5a128b,22.0.1-6-g8d3140d+720564cf76,22.0.1-6-gd805d02+cc5644f571,22.0.1-8-ge5750ce+85460ae5f3,master-g6e05de7fdc+babf819c66,master-g99da0e417a+8d77f4f51a,w.2021.48
LSST Data Management Base Package
Public Member Functions | List of all members
lsst.log.utils.LogRedirect Class Reference

Public Member Functions

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

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__()

def 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()

def 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 

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