# Progress meter library for Python. # Adam Sampson import sys, time def format_time(secs): if secs is None: return "--:--:--" else: h = secs / (60 * 60) secs = secs % (60 * 60) m = secs / 60 secs = secs % 60 return "%02d:%02d:%02d" % (h, m, secs) class Progress: def __init__(self, total, name): self.total = total self.name = name self.last_value = None self.last_time = None self.start_time = None self.closed = True self.log = [] self.last_line = None def update(self, value): self.closed = False now = time.time() if self.start_time is None: self.start_time = now elapsed = now - self.start_time if self.log == [] or (now - self.log[-1][1]) >= 1.0: self.log.append((value, now)) self.log = self.log[-4:] if self.log != []: (fv, ft) = self.log[0] (lv, lt) = self.log[-1] if (lt - ft) == 0: eta = None else: rate = (lv - fv) / (lt - ft) eta = int((self.total - value) / rate) else: eta = None s = " %-40s %3d%% %s %s\r" % (self.name[:60], int(100.0 * value / self.total), format_time(elapsed), format_time(eta)) if s != self.last_line: sys.stderr.write(s) sys.stderr.flush() self.last_line = s def close(self): if self.closed: return self.closed = True if self.last_line is not None: sys.stderr.write("\n") sys.stderr.flush()