From 6fa39070d6722dab77d58107286cbe9a1950d063 Mon Sep 17 00:00:00 2001 From: Connor Olding Date: Fri, 10 Aug 2018 08:17:29 +0200 Subject: [PATCH] forgot this file --- poopen.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 poopen.py diff --git a/poopen.py b/poopen.py new file mode 100644 index 0000000..168025f --- /dev/null +++ b/poopen.py @@ -0,0 +1,27 @@ +import subprocess as sp + +# subprocess doesn't come with very useful wrappers, +# so let's write our own! + +class PoopenError(sp.CalledProcessError): + def __init__(self, returncode, cmd, output=None, error=None): + self.returncode = returncode + self.cmd = cmd + self.output = output + self.error = error + def __str__(self): + s = "Command failed with exit status {}:\n{}".format(self.returncode, self.cmd) + if self.output: + output = str(self.output, 'utf-8', 'ignore') + s += "\nstdout:\n{}\n".format(output) + if self.error: + error = str(self.error, 'utf-8', 'ignore') + s += "\nstderr:\n{}\n".format(error) + return s + +def poopen(args, env=None): + p = sp.Popen(args, stdout=sp.PIPE, stderr=sp.PIPE, env=env) + out, err = p.communicate() + if p.returncode != 0: + raise PoopenError(returncode=p.returncode, cmd=args, output=out, error=err) + return p.returncode, out, err