[Python-ideas] Adding a subprocess.CompletedProcess class

Gregory P. Smith greg at krypto.org
Wed Jan 28 08:34:41 CET 2015


On Tue Jan 27 2015 at 4:44:32 PM Thomas Kluyver <thomas at kluyver.me.uk>
wrote:

> The subprocess module provides some nice tools to control the details of
> running a process, but it's still rather awkward for common use cases where
> you want to execute a command in one go.
>
> * There are three high-level functions: call, check_call and check_output,
> which all do very similar things with different return/raise behaviours
> * Their naming is not very clear (check_output doesn't check the output,
> it checks the return code and captures the output)
> * You can't use any of them if you want stdout and stderr separately.
> * You can get stdout and returncode from check_output, but it's not
> exactly obvious:
>
> try:
>     stdout = check_output(...)
>     returncode = 0
> except CalledProcessError as e:
>     stdout = e.output
>     returncode = e.returncode
>
> I think that what these are lacking is a good way to represent a process
> that has already finished (as opposed to Popen, which is mostly designed to
> handle a running process). So I would:
>
> 1. Add a CompletedProcess class:
> * Attributes stdout and stderr are bytes if the relevant stream was piped,
> None otherwise, like the return value of Popen.communicate()
> * Attribute returncode is the exit status
> * ? Attribute cmd is the list of arguments the process ran with (not sure
> if this should be there or not)
> * Method cp.check_returncode() raises CalledProcessError if returncode !=
> 0, inspired by requests' Response.raise_for_status()
>
> 2. Add a run() function - like call/check_call/check_output, but returns a
> CompletedProcess instance
>

I like #1 and #2 here.

3. Deprecate call/check_call/check_output, but leave them around
> indefinitely, since lots of existing code relies on them.
>

We need to keep those. They are too widely used and are the long term
stable API for 2.7. They are useful for many simple cases which they were
designed for.

-gps
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20150128/8628fa4e/attachment.html>


More information about the Python-ideas mailing list