diff --git a/examples/parallel_bars.py b/examples/parallel_bars.py index 7efccd0c..e189cb6e 100644 --- a/examples/parallel_bars.py +++ b/examples/parallel_bars.py @@ -1,6 +1,6 @@ from __future__ import print_function from time import sleep -from tqdm import tqdm +from tqdm import tqdm, trange from multiprocessing import Pool, freeze_support, RLock @@ -11,7 +11,10 @@ def progresser(n): interval = 0.001 / (len(L) - n + 2) total = 5000 text = "#{}, est. {:<04.2}s".format(n, interval * total) - for _ in tqdm(range(total), desc=text, position=n): + # NB: ensure position>0 to prevent printing '\n' on completion. + # `tqdm` can't autmoate this since this thread + # may not know about other bars in other threads #477. + for _ in tqdm(range(total), desc=text, position=n + 1): sleep(interval) @@ -21,9 +24,15 @@ if __name__ == '__main__': initializer=tqdm.set_lock, initargs=(RLock(),)) p.map(progresser, L) - print("\n" * len(L)) + print('\n' * len(L)) # alternatively, on UNIX, just use the default internal lock p = Pool(len(L)) p.map(progresser, L) - print("\n" * len(L)) + print('\n' * len(L)) + + # a manual test demonstrating automatic fix for #477 on one thread + for _ in trange(10, desc="1", position=1): + for _ in trange(10, desc="2", position=0): + sleep(0.01) + print('\n') diff --git a/tqdm/_tqdm.py b/tqdm/_tqdm.py index 2fb31bdc..ff551c97 100755 --- a/tqdm/_tqdm.py +++ b/tqdm/_tqdm.py @@ -1107,13 +1107,15 @@ Please use `tqdm_gui(...)` instead of `tqdm(..., gui=True)` # stats for overall rate (no weighted average) self.avg_time = None self.sp(self.__repr__()) - if pos is not None: + if pos: self.moveto(-pos) - else: + elif not max([abs(getattr(i, "pos", 0)) + for i in self._instances] + [0]): + # only if not nested (#477) fp_write('\n') else: self.sp('') # clear up last bar - if pos is not None: + if pos: self.moveto(-pos) else: fp_write('\r')