In invirt-base:
authorEvan Broder <broder@mit.edu>
Sun, 22 Nov 2009 21:07:11 +0000 (16:07 -0500)
committerEvan Broder <broder@mit.edu>
Sun, 22 Nov 2009 21:07:11 +0000 (16:07 -0500)
  * Add a captureOutput function to invirt.common as a convenient wrapper
    around subprocess.Popen.

svn path=/trunk/packages/invirt-base/; revision=2541

debian/changelog
python/invirt/common.py

index 1c49460..82fde94 100644 (file)
@@ -1,3 +1,10 @@
+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
 
   * Add the invirt-system component to the sources.list.
index a85d955..f228a33 100644 (file)
@@ -3,6 +3,7 @@ from __future__ import with_statement
 import unittest
 from fcntl import flock, LOCK_EX, LOCK_SH, LOCK_UN
 import contextlib as clib
+import subprocess
 
 class InvirtConfigError(AttributeError):
     pass
@@ -57,6 +58,29 @@ def lock_file(path, exclusive = True):
         finally:
             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.
 #