I’ve written a number of Python apps where I would like it to print some sort of counter or progress bar to STDOUT to let me know that it is still running instead of locked up or died somehow without me being able to see it.
I had tried using a couple of different existing progress bar related modules but none of them really worked except in a very specific use case.
So, after a bit of futzing around I came up with a very simple way to print out a updating counter to STDOUT. The synchronization code was gleaned from this post here, thank you Daniel.
Following is a working example for Python 3.7. You could write your own implementation of the progress
function to render whatever you want to STDOUT.
import threading
import sys
import time
def synchronized(func):
func.__lock__ = threading.Lock()
def synced_func(*args, **kws):
with func.__lock__:
return func(*args, **kws)
return synced_func
total = 0
@synchronized
def progress(count):
global total
total += count
sys.stdout.write(f'\rtotal: [{total}]')
sys.stdout.flush()
for i in range(500):
progress(1)
time.sleep(0.01)
print(f'\nFinished...')
Running this will generate the following output with the total value dynamically updating as the application runs:
(progressbar) rchapin@leviathan:progressbar$ python progressbar.py
total: [500]
Finished...