Make run_command() use subprocess.Popen() rather than os.popen().

This lets us capture the command's stderr as well as stdout. I've been
perplexed recently by errors from Mac SetFile commands that didn't report
stderr.
meow-7.2.2
Nat Goodspeed 2010-06-18 17:43:30 -04:00
parent 477fb26c1e
commit d34d8e491b
1 changed files with 9 additions and 5 deletions

View File

@ -39,6 +39,7 @@ import shutil
import sys
import tarfile
import errno
import subprocess
def path_ancestors(path):
drive, path = os.path.splitdrive(os.path.normpath(path))
@ -366,20 +367,23 @@ class LLManifest(object):
def run_command(self, command):
""" Runs an external command, and returns the output. Raises
an exception if the command reurns a nonzero status code. For
debugging/informational purpoases, prints out the command's
an exception if the command returns a nonzero status code. For
debugging/informational purposes, prints out the command's
output as it is received."""
print "Running command:", command
fd = os.popen(command, 'r')
sys.stdout.flush()
child = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
shell=True)
lines = []
while True:
lines.append(fd.readline())
lines.append(child.stdout.readline())
if lines[-1] == '':
break
else:
print lines[-1],
output = ''.join(lines)
status = fd.close()
child.stdout.close()
status = child.wait()
if status:
raise RuntimeError(
"Command %s returned non-zero status (%s) \noutput:\n%s"