# # Copyright © 2012 Intel Corporation # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice (including the next # paragraph) shall be included in all copies or substantial portions of the # Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS # IN THE SOFTWARE. # import os import sys import time from subprocess import Popen, PIPE, TimeoutExpired from threading import Thread __all__ = ['runProgram'] def runProgram(cmd, timeout, env = None): '''Run a program with a timeout in case it never terminates. cmd -- List of command and arguments. See subprocess.Popen. timeout -- Fractional number of seconds to wait before killing the program. env -- A dictionary containing additional environment variables to set. Returns a 4-tuple: (stdout, stderr, return code, ) ''' if env: fullEnv = os.environ.copy() fullEnv.update(env) else: fullEnv = os.environ out = '' err = '' try: proc = Popen(cmd, stdout=PIPE, stderr=PIPE, env=fullEnv, start_new_session=True, universal_newlines=True) out, err = proc.communicate(timeout=timeout) return (out, err, proc.returncode, True) except TimeoutExpired: return (out, err, proc.returncode, False)