tqdm/examples/redirect_print.py

51 lines
1.4 KiB
Python
Raw Normal View History

2017-05-29 00:19:46 +00:00
"""Redirecting writing
If using a library that can print messages to the console, editing the library
by replacing `print()` with `tqdm.write()` may not be desirable.
In that case, redirecting `sys.stdout` to `tqdm.write()` is an option.
To redirect `sys.stdout`, create a file-like class that will write
any input string to `tqdm.write()`, and supply the arguments
`file=sys.stdout, dynamic_ncols=True`.
A reusable canonical example is given below:
"""
import contextlib
import sys
2021-01-09 17:00:18 +00:00
from time import sleep
2017-05-29 00:19:46 +00:00
from tqdm import tqdm
2019-11-30 22:37:04 +00:00
from tqdm.contrib import DummyTqdmFile
2017-05-29 00:19:46 +00:00
@contextlib.contextmanager
def std_out_err_redirect_tqdm():
orig_out_err = sys.stdout, sys.stderr
2017-05-29 00:19:46 +00:00
try:
# sys.stdout = sys.stderr = DummyTqdmFile(orig_out_err[0])
sys.stdout, sys.stderr = map(DummyTqdmFile, orig_out_err)
yield orig_out_err[0]
2017-05-29 00:19:46 +00:00
# Relay exceptions
except Exception as exc:
raise exc
# Always restore sys.stdout/err if necessary
2017-05-29 00:19:46 +00:00
finally:
sys.stdout, sys.stderr = orig_out_err
2017-05-29 00:19:46 +00:00
def some_fun(i):
print("Fee, fi, fo,".split()[i])
2017-05-29 00:19:46 +00:00
# Redirect stdout to tqdm.write()
with std_out_err_redirect_tqdm() as orig_stdout:
# tqdm needs the original stdout
2017-05-29 00:19:46 +00:00
# and dynamic_ncols=True to autodetect console width
for i in tqdm(range(3), file=orig_stdout, dynamic_ncols=True):
2017-10-05 01:13:26 +00:00
# order of the following two lines should not matter
some_fun(i)
2017-10-05 01:13:26 +00:00
sleep(.5)
2017-05-29 00:19:46 +00:00
# After the `with`, printing is restored
print("Done!")