def run_cmd(cmd, args=None, tool=None):
stats = {'timed_out': False,
'output': ''}
timer = None
out = None
out_file = None
friendly_cmd = ' '.join(cmd)
if args and args.verbose and args.log_to_stderr:
out = sys.stderr
elif tool:
out_file = os.path.join(args.output_directory, tool + ".log")
out = open(out_file, 'a')
def output(line):
if out:
out.write(line)
out.flush()
def kill_proc(proc, stats):
output("Timed out after {} seconds on {}\n".format(args.timeout, friendly_cmd))
stats['timed_out'] = True
proc.kill()
output("Running {}\n\n".format(friendly_cmd))
try:
start_time = timeit.default_timer()
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
if args and args.timeout:
timer = Timer(args.timeout, kill_proc, [process, stats])
timer.start()
for line in iter(process.stdout.readline, b''):
stats['output'] = stats['output'] + line
output(line)
process.stdout.close()
process.wait()
stats['time'] = timeit.default_timer() - start_time
stats['return_code'] = process.returncode
if timer:
timer.cancel()
except:
output('calling {cmd} failed\n{trace}\n'.format(cmd=friendly_cmd,trace=traceback.format_exc()))
if out_file:
out.close()
return stats
评论列表
文章目录