Index: trunk/packages/invirt-base/python/invirt/common.py
===================================================================
--- trunk/packages/invirt-base/python/invirt/common.py	(revision 2097)
+++ trunk/packages/invirt-base/python/invirt/common.py	(revision 2541)
@@ -4,4 +4,5 @@
 from fcntl import flock, LOCK_EX, LOCK_SH, LOCK_UN
 import contextlib as clib
+import subprocess
 
 class InvirtConfigError(AttributeError):
@@ -58,4 +59,27 @@
             flock(f, LOCK_UN)
 
+def captureOutput(popen_args, stdin_str=None, *args, **kwargs):
+    """Capture stdout from a command.
+
+    This method will proxy the arguments to subprocess.Popen. It
+    returns the output from the command if the call succeeded and
+    raises an exception if the process returns a non-0 value.
+
+    This is intended to be a variant on the subprocess.check_call
+    function that also allows you access to the output from the
+    command.
+    """
+    if 'stdin' not in kwargs:
+        kwargs['stdin'] = subprocess.PIPE
+    if 'stdout' not in kwargs:
+        kwargs['stdout'] = subprocess.PIPE
+    if 'stderr' not in kwargs:
+        kwargs['stderr'] = subprocess.STDOUT
+    p = subprocess.Popen(popen_args, *args, **kwargs)
+    out, _ = p.communicate(stdin_str)
+    if p.returncode:
+        raise subprocess.CalledProcessError(p.returncode, popen_args, out)
+    return out
+
 #
 # Exceptions.
