Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
S2-group
GitHub Repository: S2-group/android-runner
Path: blob/master/__main__.py
625 views
1
import argparse
2
import logging
3
import os.path as op
4
import sys
5
import time
6
7
import paths
8
from AndroidRunner.ExperimentFactory import ExperimentFactory
9
from AndroidRunner.Progress import Progress
10
from AndroidRunner.util import makedirs
11
12
13
def main():
14
args = parse_arguments(sys.argv[1:])
15
progress, log_dir = set_progress(args)
16
config_file = op.abspath(args['file'])
17
setup_paths(config_file, log_dir)
18
logger = setup_logger(log_dir)
19
20
try:
21
progress_file = progress.get_progress_xml_file()
22
except Exception:
23
progress_file = ' No progress file created'
24
25
try:
26
experiment = ExperimentFactory.from_json(config_file, progress)
27
progress_file = experiment.get_progress_xml_file()
28
experiment.start()
29
except Exception as e:
30
logger.error('%s: %s' % (e.__class__.__name__, str(e)))
31
logger.error('An error occurred, the experiment has been stopped. '
32
'To continue, add progress file argument to experiment startup: '
33
'--progress {}'.format(progress_file))
34
except KeyboardInterrupt:
35
logger.error('Experiment stopped by user. '
36
'To continue, add progress file argument to experiment startup: '
37
38
'--progress {}'.format(progress_file))
39
40
41
def set_progress(args):
42
config_file = op.abspath(args['file'])
43
if not args.get('progress') is None:
44
progress = Progress(progress_file=args['progress'], config_file=config_file, load_progress=True)
45
log_dir = progress.get_output_dir()
46
else:
47
log_dir = op.join(op.dirname(config_file), 'output/%s/' % time.strftime('%Y.%m.%d_%H%M%S'))
48
progress = None
49
return progress, log_dir
50
51
52
def parse_arguments(args):
53
parser = argparse.ArgumentParser()
54
parser.add_argument('file')
55
parser.add_argument('--progress', default=argparse.SUPPRESS)
56
return vars(parser.parse_args(args))
57
58
59
def setup_paths(config_file, log_dir):
60
paths.CONFIG_DIR = op.dirname(config_file)
61
paths.ORIGINAL_CONFIG_DIR = config_file
62
makedirs(log_dir)
63
paths.OUTPUT_DIR = log_dir
64
paths.BASE_OUTPUT_DIR = log_dir
65
sys.path.append(op.join(paths.ROOT_DIR, 'AndroidRunner'))
66
67
68
def setup_logger(log_dir):
69
log_filename = op.join(log_dir, 'experiment.log')
70
logger = logging.getLogger()
71
logger.setLevel(logging.DEBUG)
72
logger.addHandler(set_file_logger(log_filename))
73
logger.addHandler(set_stdout_logger())
74
return logger
75
76
77
def set_file_logger(log_filename):
78
file_logger = logging.FileHandler(log_filename)
79
file_logger.setLevel(logging.DEBUG)
80
file_logger.setFormatter(logging.Formatter('%(asctime)s:%(levelname)s:%(name)s:%(message)s'))
81
return file_logger
82
83
84
def set_stdout_logger():
85
stdout_logger = logging.StreamHandler(sys.stdout)
86
stdout_logger.setLevel(logging.INFO)
87
stdout_logger.setFormatter(logging.Formatter('%(name)s: %(message)s'))
88
return stdout_logger
89
90
91
if __name__ == "__main__": \
92
main()
93
94