New submission from Nick Coghlan <ncogh...@gmail.com>:

Currently, pipes in the subprocess module work strictly with bytes I/O, 
*unless* you set "universal newlines=True". In that case, it assumes an output 
encoding of UTF-8 for stdout and stderr and applies universal newlines process.

When stdin/out/err are remapped to ordinary I/O streams then 'encoding' and 
'errors' can be specified as usual, but it is currently challenging to do this 
for pipes. Since they're created internally by the subprocess module, user code 
doesn't get the opportunity to wrap them when using the convenience APIs. When 
using Popen objects, you have to create the object, then wrap each stream 
individually (rebinding the attributes as you go).

My suggestion is that we add a new option for the stdin/out/err arguments:

    class TextPipe:
        def __init__(self, encoding, errors='strict'):
            self.encoding = encoding
            self.errors = errors

So to read UTF-8 encoded data from a subprocess, you could just do:

    data = check_stdout(cmd, stdout=TextPipe('utf-8'), stderr=STDOUT)

There are at least a couple of other alternatives here:

- separate out the pipe creation logic from the Popen logic so it is possible 
to create and wrap the pipe objects explicitly and then pass the wrapped pipe 
object to the subprocess invocation APIs. 'TextPipe' would then actually be 
such a wrapped pipe, rather than merely instructions to tell Popen what kind of 
pipe to create.
- instead of adding 'TextPipe', just re-use the PIPE name (with the class 
itself still being used as a marker constant to request implicit creation of a 
binary PIPE)

----------
assignee: docs@python
components: Documentation
messages: 148022
nosy: docs@python, ncoghlan
priority: normal
severity: normal
stage: needs patch
status: open
title: Better support for pipe I/O encoding in subprocess
versions: Python 3.3

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue13442>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to