Allow for custom stdout/stderr/stdin streams when instantiating a Command.

Review Request #12242 — Created April 20, 2022 and submitted


Command now takes stdout, stderr, and stdin arguments. These are
expected, in the case of custom streams, to be io.TextIOWrapper
instances, wrapping a io.BytesIO.

The standard and JSON output wrappers on Command instances will wrap
these instead of assuming the versions on sys. The log stream will
wrap stderr as well (it normally defaults to sys.stderr), ensuring
that all logs are, by default, outputted to that stream. This can, as
always, be overridden with a more explicit logging setup if automating

There's also *_is_atty attributes computed for each of these streams
when instantiating. These replace the previous .isatty() checks, and
are more robust, handling the case where this attribute is missing.

This will be used for unit tests that need to capture command output or
simulate input.

Tested running RBTools commands on Python 2, 3.6, and 3.10. Checked
default stdout, stderr, and stdin functionality.

Made use of this in upcoming unit test support. Verified that I could
override the streams successfully on all supported versions of Python
and grab the resulting output (or supply the resulting input).

Allow for custom stdout/stderr/stdin streams when instantiating a Command.
  1. Ship It!
Review request changed

Status: Closed (submitted)

Change Summary:

Pushed to release-3.x (d79b794)