Source code for bag.command
"""Simplifying usage of the **subprocess** module of the standard library."""
import subprocess
from sys import platform
[docs]class CommandError(Exception): # noqa
def __init__(self, error_message, code, out=""): # noqa
self.error_message = error_message
self.code = code
self.out = out
def __str__(self):
return self.error_message + " (exit code: {})".format(self.code)
[docs]def execute(command, input="", shell=True, encoding="utf-8"):
p = subprocess.Popen(
command,
shell=shell,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
close_fds=not platform.startswith("win"),
)
i, o, e = (p.stdin, p.stdout, p.stderr)
if input:
i.write(input)
i.close()
return_code = p.wait()
normal_output = o.read().strip().decode(encoding)
error_output = e.read().strip().decode(encoding)
o.close()
e.close()
return return_code, normal_output, error_output
[docs]def checked_execute(command, input="", shell=True, encoding="utf-8", accept_codes=[0]):
ret, out, err = execute(command, input=input, shell=shell, encoding=encoding)
if ret in accept_codes:
return out
else:
raise CommandError(err, ret, out)