diff options
author | Martin Jansa <Martin.Jansa@gmail.com> | 2011-04-04 09:44:36 +0200 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2011-05-16 15:19:31 +0100 |
commit | 8ae63486aff06ed37ddad9606ead0a9176dab468 (patch) | |
tree | 7e31d8b900c88edeb8a9796f4f1e89490838b6de /meta/lib/oe | |
parent | 7f12a24771bca786095f823aeb2d322c52c266d2 (diff) | |
download | openembedded-core-8ae63486aff06ed37ddad9606ead0a9176dab468.tar.gz openembedded-core-8ae63486aff06ed37ddad9606ead0a9176dab468.tar.bz2 openembedded-core-8ae63486aff06ed37ddad9606ead0a9176dab468.tar.xz openembedded-core-8ae63486aff06ed37ddad9606ead0a9176dab468.zip |
lib/oe/process.py: import from OE
Diffstat (limited to 'meta/lib/oe')
-rw-r--r-- | meta/lib/oe/process.py | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/meta/lib/oe/process.py b/meta/lib/oe/process.py new file mode 100644 index 000000000..26c3e6591 --- /dev/null +++ b/meta/lib/oe/process.py @@ -0,0 +1,74 @@ +import subprocess +import signal + +def subprocess_setup(): + # Python installs a SIGPIPE handler by default. This is usually not what + # non-Python subprocesses expect. + signal.signal(signal.SIGPIPE, signal.SIG_DFL) + +class CmdError(RuntimeError): + def __init__(self, command): + self.command = command + + def __str__(self): + if not isinstance(self.command, basestring): + cmd = subprocess.list2cmdline(self.command) + else: + cmd = self.command + + return "Execution of '%s' failed" % cmd + +class NotFoundError(CmdError): + def __str__(self): + return CmdError.__str__(self) + ": command not found" + +class ExecutionError(CmdError): + def __init__(self, command, exitcode, stdout = None, stderr = None): + CmdError.__init__(self, command) + self.exitcode = exitcode + self.stdout = stdout + self.stderr = stderr + + def __str__(self): + message = "" + if self.stderr: + message += self.stderr + if self.stdout: + message += self.stdout + if message: + message = ":\n" + message + return (CmdError.__str__(self) + + " with exit code %s" % self.exitcode + message) + +class Popen(subprocess.Popen): + defaults = { + "close_fds": True, + "preexec_fn": subprocess_setup, + "stdout": subprocess.PIPE, + "stderr": subprocess.STDOUT, + "stdin": subprocess.PIPE, + "shell": False, + } + + def __init__(self, *args, **kwargs): + options = dict(self.defaults) + options.update(kwargs) + subprocess.Popen.__init__(self, *args, **options) + +def run(cmd, input=None, **options): + """Convenience function to run a command and return its output, raising an + exception when the command fails""" + + if isinstance(cmd, basestring) and not "shell" in options: + options["shell"] = True + try: + pipe = Popen(cmd, **options) + except OSError, exc: + if exc.errno == 2: + raise NotFoundError(cmd) + else: + raise + stdout, stderr = pipe.communicate(input) + if pipe.returncode != 0: + raise ExecutionError(cmd, pipe.returncode, stdout, stderr) + return stdout |