Question about propagating universal_newlines through subprocess.Popen to io.TextIOWrapper

Bill Deegan bill at baddogconsulting.com
Mon Jun 26 16:59:25 EDT 2017


On Mon, Jun 26, 2017 at 12:44 PM, eryk sun <eryksun at gmail.com> wrote:

> On Mon, Jun 26, 2017 at 5:23 PM, Bill Deegan <bill at baddogconsulting.com>
> wrote:
> >
> > That universal_newlines value is discarded due to:
> >
> > text_mode = encoding or errors or universal_newlines
> >
> > ...
> >
> > if text_mode:
> >     self.stdout = io.TextIOWrapper(self.stdout,
> >             encoding=encoding, errors=errors)
> >
> > There doesn't seem to be a way to set encoding without forcing
> > univeral_newlines.
> >
> > This seems like a bug?
>
> The behavior is documented:
>
>     If encoding or errors are specified, or universal_newlines is true,
>     the file objects stdin, stdout and stderr will be opened in text
>     mode using the encoding and errors specified in the call or the
>     defaults for io.TextIOWrapper.
>
>     For stdin, line ending characters '\n' in the input will be
>     converted to the default line separator os.linesep. For stdout and
>     stderr, all line endings in the output will be converted to '\n'.
>     For more information see the documentation of the io.TextIOWrapper
>     class when the newline argument to its constructor is None.
>
> Prior to 3.6, the way to get text streams was to enable
> universal_newlines. Maybe for 3.7 the default can change to None, with
> the addition of the following code:
>
>     if universal_newlines is None or universal_newlines:
>         newline = None
>     else:
>         newline = ''
>
>     if text_mode:
>         self.stdin = io.TextIOWrapper(self.stdin, write_through=True,
>                 line_buffering=(bufsize == 1),
>                 encoding=encoding, errors=errors, newline=newline)
>

Ideally (for my use case) it would be something which propagated
universal_newlines to io.TextIOWrapper().. rather than discards it.
In my case I want the stdout to be encoded utf-8, but I do not want \r's
changed to \n's as my test system is capturing the output of a progress
indicator which uses \r to return to beginning of line and overwrite the
previous output.

-Bill



More information about the Python-list mailing list