ubelt.util_stream module¶
Functions for capturing and redirecting IO streams.
The CaptureStdout
captures all text sent to stdout and optionally
prevents it from actually reaching stdout.
The TeeStringIO
does the same thing but for arbitrary streams. It is
how the former is implemented.
-
class
ubelt.util_stream.
TeeStringIO
(redirect=None)[source]¶ Bases:
_io.StringIO
An IO object that writes to itself and another IO stream.
- Variables
redirect (io.IOBase) – The other stream to write to.
Example
>>> redirect = io.StringIO() >>> self = TeeStringIO(redirect)
-
isatty
()[source]¶ Returns true of the redirect is a terminal.
Notes
Needed for IPython.embed to work properly when this class is used to override stdout / stderr.
-
fileno
()[source]¶ Returns underlying file descriptor of the redirected IOBase object if one exists.
Example
>>> # Not sure the best way to test, this func is important for >>> # capturing stdout when ipython embedding >>> import pytest >>> with pytest.raises(io.UnsupportedOperation): >>> TeeStringIO(redirect=io.StringIO()).fileno() >>> with pytest.raises(io.UnsupportedOperation): >>> TeeStringIO(None).fileno()
-
property
encoding
¶ Gets the encoding of the redirect IO object
Example
>>> redirect = io.StringIO() >>> assert TeeStringIO(redirect).encoding is None >>> assert TeeStringIO(None).encoding is None >>> assert TeeStringIO(sys.stdout).encoding is sys.stdout.encoding >>> redirect = io.TextIOWrapper(io.StringIO()) >>> assert TeeStringIO(redirect).encoding is redirect.encoding
-
class
ubelt.util_stream.
CaptureStream
[source]¶ Bases:
object
Generic class for capturing streaming output from stdout or stderr
-
class
ubelt.util_stream.
CaptureStdout
(supress=True, enabled=True)[source]¶ Bases:
ubelt.util_stream.CaptureStream
Context manager that captures stdout and stores it in an internal stream
- Parameters
supress (bool, default=True) – if True, stdout is not printed while captured
enabled (bool, default=True) – does nothing if this is False
Example
>>> self = CaptureStdout(supress=True) >>> print('dont capture the table flip (╯°□°)╯︵ ┻━┻') >>> with self: ... text = 'capture the heart ♥' ... print(text) >>> print('dont capture look of disapproval ಠ_ಠ') >>> import six >>> assert isinstance(self.text, six.text_type) >>> assert self.text == text + '\n', 'failed capture text'
Example
>>> self = CaptureStdout(supress=False) >>> with self: ... print('I am captured and printed in stdout') >>> assert self.text.strip() == 'I am captured and printed in stdout'
Example
>>> self = CaptureStdout(supress=True, enabled=False) >>> with self: ... print('dont capture') >>> assert self.text is None