#!/usr/bin/env python import time def printProgressBar (iteration:int, total:int, prefix:str = '', suffix:str = '', decimals:int = 1, length:int = 100, fill:str = '█', printEnd:str = "\r"): """Print iterations progress. Call in a loop to create terminal progress bar. - current iteration - total iterations - prefix string - suffix string - positive number of decimals in percent complete - character length of bar - bar fill character - end character (e.g. "\r", "\r\n") """ percent = ("{0:." + str(decimals) + "f}").format(100 * (iteration / float(total))) filledLength = int(length * iteration // total) bar = fill * filledLength + '-' * (length - filledLength) print(f'\r{prefix} |{bar}| {percent}% {suffix}', end = printEnd) # Print New Line on Complete if iteration == total: print() class ExitSignalHandler(): """Handle exit event""" def __init__(self): import signal import threading global __exit_event global __on_exit_signal __exit_event = threading.Event() def __on_exit_signal(signo, _frame): __exit_event.set() for sig in ('TERM', 'HUP', 'INT'): signal.signal(getattr(signal, 'SIG'+sig), __on_exit_signal) def status(self): return __exit_event.is_set() class TimeProbe(): """Assess temporal performance""" def __init__(self): self.start() def start(self): """Start chronometer.""" self.__last_time = time.perf_counter() self.__lap_counter = 0 self.__elapsed_time = 0 def lap(self): """Get the last lap time, number of laps and total elapsed time in millisecond.""" lap_time = time.perf_counter() - self.__last_time self.__last_time = time.perf_counter() self.__lap_counter += 1 self.__elapsed_time += lap_time return lap_time * 1e3, self.__lap_counter, self.__elapsed_time * 1e3 def end(self): """Stop chronometer and get elapsed time in millisecond.""" self.__elapsed_time += time.perf_counter() - self.__last_time return self.__elapsed_time * 1e3, self.__lap_counter def restart(self): self.start()