Last active
July 14, 2016 01:41
-
-
Save deeenes/ff8a498842ed8d8dc8af888a130b20b5 to your computer and use it in GitHub Desktop.
simple percent or count progress bar
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
import sys | |
import time | |
__all__ = ['Progress'] | |
class Progress(object): | |
def __init__(self, total = None, name = "Progress", | |
interval = 3000, percent = True, status = 'initializing'): | |
self.status = status | |
self.name = name | |
self.interval = interval | |
self.set_total(total) | |
self.done = 0 | |
self.percent = percent | |
self.in_ipython() | |
self.last_updated = time.time() | |
self.start_time = time.time() | |
self.min_update_interval = 0.0 \ | |
if not self.ipython or self.ipython == 'terminal' \ | |
else 1.0 | |
sys.stdout.write("\r"+" "*200) | |
if self.percent: | |
sys.stdout.write("\r\t:: %s: %s 0.00%%" % \ | |
(self.name, '%s,'%self.status)) | |
else: | |
self.total = int(self.total) | |
sys.stdout.write("\r\t:: %s: %s 0/%u" % \ | |
(self.name, '%s,'%self.status, self.total)) | |
sys.stdout.flush() | |
def step(self, step = 1, msg = None, status = 'working on it', force = False): | |
self.status = status | |
self.done += step | |
if force or (self.done % self.interval < 1.0 and \ | |
time.time() - self.last_updated > self.min_update_interval): | |
sys.stdout.write("\r"+" "*200) | |
if self.percent: | |
sys.stdout.write( | |
"\r\t:: %s: %s %.2f%% %s" % ( | |
self.name, | |
'' if self.status is None else'%s,'%self.status, | |
float(self.done)/float(self.total)*100.0, | |
'' if msg is None else '[%s]'%msg)) | |
else: | |
sys.stdout.write( | |
"\r\t:: %s: %s %u/%u %s" % ( | |
self.name, '%s,'%self.status, self.done, self.total, | |
'' if msg is None else '[%s]'%msg)) | |
sys.stdout.flush() | |
self.last_updated = time.time() | |
def set_total(self, total): | |
self.total = total or 9999999999.0 | |
def set_done(self, done): | |
self.done = done | |
def set_status(self, status): | |
#if self.ipython == 'notebook': | |
# status = '%s; progress indicator disabled in IPython notebook.' % status | |
self.step(step = 0, status = status, force = True) | |
def terminate(self, status = 'finished'): | |
self.finished_time = time.time() | |
self.seconds_elapsed = self.finished_time - self.start_time | |
m, s = divmod(self.seconds_elapsed, 60) | |
h, m = divmod(m, 60) | |
self.time_elapsed = "%d:%02d:%02d" % (h, m, s) | |
sys.stdout.write("\r"+" "*200) | |
self.status = status | |
if self.percent: | |
sys.stdout.write("\r\t:: %s: %s 100.0%% [%s elapsed]" % \ | |
(self.name, '%s,'%self.status, self.time_elapsed)) | |
else: | |
sys.stdout.write("\r\t:: %s: %s %u/%u [%s elapsed]" % (\ | |
self.name, | |
'%s,'%self.status, | |
self.total, | |
self.total, | |
self.time_elapsed) | |
) | |
sys.stdout.write("\n") | |
sys.stdout.flush() | |
self.last_updated = time.time() | |
def in_ipython(self): | |
self.ipython = False | |
if 'ipykernel' in sys.modules: | |
self.ipython = 'notebook' | |
elif 'Ipython' in sys.modules: | |
self.ipython = 'terminal' |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment