Я хотел бы хороший метод, который соответствует интерфейсу subprocess.check_call
- т.е., это бросает CalledProcessError
то, когда это перестало работать, синхронно, &c - но вместо того, чтобы возвратить код возврата команды (если это даже делает это) возвращает вывод программы, или только stdout, или кортеж (stdout, stderr).
У кого-то есть метод, который делает это?
from subprocess import check_output as qx
Из 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()
.