Redirect print command in python script through tqdm.write()

后端 未结 4 675
抹茶落季
抹茶落季 2020-12-10 01:46

I\'m using tqdm in Python to display console-progressbars in our scripts. However, I have to call functions which print messages to the console as

4条回答
  •  孤城傲影
    2020-12-10 02:22

    By mixing, user493630 and gaborous answers, I created this context manager which avoid having to use the file=sys.stdout parameter of tqdm.

    import inspect
    import contextlib
    import tqdm
    
    @contextlib.contextmanager
    def redirect_to_tqdm():
        # Store builtin print
        old_print = print
        def new_print(*args, **kwargs):
            # If tqdm.tqdm.write raises error, use builtin print
            try:
                tqdm.tqdm.write(*args, **kwargs)
            except:
                old_print(*args, ** kwargs)
    
        try:
            # Globaly replace print with new_print
            inspect.builtins.print = new_print
            yield
        finally:
            inspect.builtins.print = old_print
    

    To use it, simply:

    for i in tqdm.tqdm(range(100)):
        with redirect_to_tqdm():
            time.sleep(.1)
            print(i)
    

    To simplify even further, it is possible to wrap the code in a new function:

    def tqdm_redirect(*args, **kwargs):
        with redirect_to_tqdm():
            for x in tqdm.tqdm(*args, **kwargs):
                yield x
    
    for i in tqdm_redirect(range(20)):
        time.sleep(.1)
        print(i)
    

提交回复
热议问题