adding function execute() to shell out

This commit is contained in:
Martin A. Brown 2016-02-15 14:03:56 -08:00
parent 3f08105232
commit 73305ca97f
1 changed files with 30 additions and 1 deletions

View File

@ -5,11 +5,13 @@ from __future__ import absolute_import, division, print_function
import os
import io
import sys
import subprocess
from tempfile import mkstemp
import logging
def getLogger(**opts):
level = opts.get('level', logging.INFO)
level = opts.get('level', logging.DEBUG)
logging.basicConfig(stream=sys.stderr, level=level)
logger = logging.getLogger()
return logger
@ -17,6 +19,33 @@ def getLogger(**opts):
logger = getLogger()
def execute(cmd, stdin=None, stdout=None, stderr=None,
logdir=None, env=os.environ):
prefix = os.path.basename(cmd[0]) + '.' + str(os.getpid()) + '-'
if logdir is None:
raise Exception("Missing, required parameter: logdir.")
assert os.path.isdir(logdir)
# -- not remapping STDIN, because that doesn't make sense here
if stdout is None:
stdout, stdoutname = mkstemp(prefix=prefix, suffix='.stdout',
dir=logdir)
if stderr is None:
stderr, stderrname = mkstemp(prefix=prefix, suffix='.stderr',
dir=logdir)
logger.debug("About to execute: %r", cmd)
proc = subprocess.Popen(cmd, shell=False, close_fds=True,
stdin=stdin, stdout=stdout, stderr=stderr,
env=env, preexec_fn=os.setsid)
result = proc.wait()
if result != 0:
logger.warning("Return code (%s) for process: %r", result, cmd)
logger.warning("Find STDOUT/STDERR in %s/%s", logdir, prefix)
return result
def is_executable(fpath):
return os.path.isfile(fpath) and os.access(fpath, os.X_OK)