[Python-ideas] Add output() helper function to subprocess module

Nathaniel Smith njs at pobox.com
Thu Apr 4 05:10:50 EDT 2019


On Thu, Apr 4, 2019 at 1:59 AM Greg Ewing <greg.ewing at canterbury.ac.nz> wrote:
>
> Nathaniel Smith wrote:
> > On Thu, Apr 4, 2019 at 12:48 AM Greg Ewing <greg.ewing at canterbury.ac.nz> wrote:
> >>output(args) --> (status, output)
> >
> > Isn't this already available as: run(args, stdout=PIPE)?
>
> Yes, but you need to do more than that to get the output
> as a string. This is the relevant part of the implementation
> of check_output():
>
>      process = Popen(stdout=PIPE, *popenargs, **kwargs)
>      output, unused_err = process.communicate()
>      retcode = process.poll()

>>> from subprocess import run, pipe
>>> p = run(["grep", "njs", "/etc/passwd"], stdout=PIPE)
>>> p.returncode
0
>>> p.stdout
b'njs:x:1000:1000:Nathaniel J. Smith,,,:/home/njs:/usr/bin/zsh\n'

I do think it's a bit weird that you write 'stdout=PIPE' to mean
'please capture stdout' – it's leaking an internal implementation
detail across an abstraction boundary. But it's documented, and run()
allows any combination of check=True/False, capturing stdout or not,
and capturing stderr or not, without having to invent 8 different
functions.

-n

-- 
Nathaniel J. Smith -- https://vorpus.org


More information about the Python-ideas mailing list