Index: trunk/packages/invirt-base/debian/changelog
===================================================================
--- trunk/packages/invirt-base/debian/changelog	(revision 2540)
+++ trunk/packages/invirt-base/debian/changelog	(revision 2541)
@@ -1,2 +1,9 @@
+invirt-base (0.0.26) unstable; urgency=low
+
+  * Add a captureOutput function to invirt.common as a convenient wrapper
+    around subprocess.Popen.
+
+ -- Evan Broder <broder@mit.edu>  Sun, 22 Nov 2009 04:35:43 -0500
+
 invirt-base (0.0.25) unstable; urgency=low
 
Index: trunk/packages/invirt-base/python/invirt/common.py
===================================================================
--- trunk/packages/invirt-base/python/invirt/common.py	(revision 2540)
+++ 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.
