Что является хорошим эквивалентом subprocess.check_call, который возвращает содержимое stdout?

Я бы хотел, чтобы хороший метод соответствовал интерфейсу subprocess.check_call то есть он выбрасывал CalledProcessError при его сбое, является синхронным, & c – но вместо возврата кода возврата команды (если он это делает) возвращается выход программы, либо только stdout, либо кортеж (stdout, stderr).

У кого-то есть метод, который делает это?

    Python 2.7+

     from subprocess import check_output as qx 

    Python <2,7

    Из subprocess.py :

     import subprocess def check_output(*popenargs, **kwargs): if 'stdout' in kwargs: raise ValueError('stdout argument not allowed, it will be overridden.') process = subprocess.Popen(stdout=subprocess.PIPE, *popenargs, **kwargs) output, unused_err = process.communicate() retcode = process.poll() if retcode: cmd = kwargs.get("args") if cmd is None: cmd = popenargs[0] raise subprocess.CalledProcessError(retcode, cmd, output=output) return output class CalledProcessError(Exception): def __init__(self, returncode, cmd, output=None): self.returncode = returncode self.cmd = cmd self.output = output def __str__(self): return "Command '%s' returned non-zero exit status %d" % ( self.cmd, self.returncode) # overwrite CalledProcessError due to `output` keyword might be not available subprocess.CalledProcessError = CalledProcessError 

    См. Также Захват вывода системной команды в виде строки для другого примера возможной реализации check_output() .

    Я не могу получить форматирование в комментарии, так что это ответ на ответ Дж. Ф. Себастьяна

    Я нашел это очень полезным, поэтому я решил, что добавлю к этому ответу. Я хотел иметь возможность работать без проблем в коде без проверки версии. Это то, что я сделал …

    Я поставил код выше в файл под названием subprocess_compat.py. Затем в коде, где я использую subprocess, я сделал.

     import sys if sys.version_info < (2, 7): import subprocess_compat subprocess.check_output = subprocess_compat.check_output 

    Теперь в любом месте кода я могу просто вызвать «subprocess.check_output» с параметрами, которые я хочу, и он будет работать независимо от того, какую версию python я использую.

    Эта функция возвращает вывод терминала в виде списка строк.

     import subprocess,sys def output(cmd): cmd_l = cmd.split() output = subprocess.Popen(cmd_l, stdout=subprocess.PIPE).communicate()[0] output = output.decode("utf-8") return (output) 
    Давайте будем гением компьютера.