class Dir: def arg_id(self, arg): result = self.name for k, v in arg: result = result + "-" + k + "-" + str(v) return result def write_time(self, t): f = open("time-used", "w") f.write(str(t)) f.close() def read_time(self): f = open("time-used", "r") t = float(f.read()) f.close() return t def __init__(self, conf): self.conf = conf self.name = conf["name"] if not os.path.exists(self.name): os.mkdir(self.name) os.chdir(self.name) if not os.path.exists("time-used"): self.write_time(0) self.start_time = datetime.datetime.now() self.time_used = self.read_time() self.result = Result(conf) self.refresh() def read(self, arg): newresult = {} f = open(self.arg_id(arg), "r") for line in f.readlines(): line = line.strip().split() if len(line) % 2 == 1 or len(line) < 2: # Fail utils.fail(self.arg_id(arg)) f.close() return new_key = {k: v for k, v in arg} # parse line for i in xrange(0, len(line) - 2, 2): i_name = line[i] i_value = float(line[i + 1]) new_key[i_name] = i_value new_key["name"] = line[-2] newresult[utils.dict2tuple(new_key)] = float(line[-1]) # Merge result with newresult for k in newresult.keys(): self.result[k] = newresult[k] f.close() def refresh(self): # Load data self.finished_tasks = 0 for arg in self.result.args(): if utils.finished(self.arg_id(arg)): if not utils.failed(self.arg_id(arg)): self.read(arg) self.finished_tasks += 1 self.total_tasks = len(self.result.args()) t = datetime.datetime.now() td = t - self.start_time self.start_time = t self.time_used += td.seconds * 1e6 + td.microseconds self.write_time(self.time_used) def write_status(self, cr=True): percentage = self.finished_tasks * 100 / self.total_tasks content = "%s: %d/%d (%d%%)" % (self.name, self.finished_tasks, self.total_tasks, percentage) s = self.time_used / 1e6 m = int(s / 60) % 60 h = int(s / 3600) % 24 d = int(s / 86400) s = s % 60 if d == 0: content += " Time: %02d:%02d:%02d" % (h, m, s) else: content += " Time: %d d %02d:%02d:%02d" % (d, h, m, s) if cr: content = "\r" + content sys.stdout.write(content) sys.stdout.flush() def start(self, arg): f = open(self.arg_id(arg) + ".todo", "w") content = json.dumps(arg) f.write(content) f.close() def get_result(self): return self.result