def run_subprocess(args, options): from threading import Timer from mysubprocess import Popen, PIPE, STDOUT popen_args = [sys.executable, sys.argv[0], '--record', '--runid', options.runid, '--verbosity', options.verbosity] if options.db: popen_args += ['--db', options.db] popen_args += args popen_args = [str(x) for x in popen_args] if options.capture: popen = Popen(popen_args, stdout=PIPE, stderr=STDOUT, shell=False) else: popen = Popen(popen_args, shell=False) retcode = [] def killer(): retcode.append('TIMEOUT') print >> sys.stderr, 'Killing %s (%s) because of timeout' % (popen.pid, args) popen.kill() timeout = Timer(options.timeout, killer) timeout.start() output = '' output_printed = False try: try: if options.capture: while True: data = popen.stdout.read(1) if not data: break output += data if options.verbosity >= 2: sys.stdout.write(data) output_printed = True retcode.append(popen.wait()) except Exception: popen.kill() raise finally: timeout.cancel() # QQQ compensating for run_tests' screw up module_name = args[0] if module_name.endswith('.py'): module_name = module_name[:-3] output = output.replace(' (__main__.', ' (' + module_name + '.') return retcode[0], output, output_printed