python - 使用 python tqdm 库重定向 stdout 和 stderr

标签 python tqdm

我在 Python 中使用 tqdm 来显示控制台进度条。

我有一个来自另一个库的函数,它偶尔会写入 tqdm 循环内的 stdout 和 stderr。我无法破解该函数的源代码。

同时this doc显示如何重定向 sys.stdout,它不容易推广到 stderr,因为我只能将 stdout 或 stderr 之一传递给 tqdm 的 __init__ 中的 file= 参数。请引用this question及其 accepted answer获取说明问题的最少代码。

如何将 stdout 和 stderr 重定向到一起?

最佳答案

Python 在标准库中为您提供了一些帮助程序,请查看 contextlib :

>>> import io, sys
>>> from contextlib import redirect_stdout, redirect_stderr
>>> from tqdm import tqdm
>>> def foo():
...     print('spam to stdout')
...     print('spam to stderr', file=sys.stderr)
...     
>>> out = io.StringIO()
>>> err = io.StringIO()
>>> with redirect_stdout(out), redirect_stderr(err):
...     for x in tqdm(range(3), file=sys.__stdout__):
...         print(x)  # more spam
...         foo()
...         
100%|██████████| 3/3 [00:00<00:00, 29330.80it/s]
>>> out.getvalue()
'0\nspam to stdout\n1\nspam to stdout\n2\nspam to stdout\n'
>>> err.getvalue()
'spam to stderr\nspam to stderr\nspam to stderr\n'

关于python - 使用 python tqdm 库重定向 stdout 和 stderr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45722952/

相关文章:

python-3.x - tqdm 以人类可读的单位显示下载

python - 每次在 tqdm 对象(VSCode 终端)上调用更新时,进度条(使用 tqdm)都会在新行中打印

python-2.7 - 将进度条添加到 gdal.Warp()

python - 如何在 mac 上的 vscode 中自动加载 venv/bin/activate

python - 对多个列进行分组并在组内排名

python - 使用 Tqdm 在下载文件时添加进度条

python - 迭代完成后如何删除tqdm中的进度条

python - 如何在 GAE Python 中查询结构化属性内的计算属性

python - 如何替换文本 block 中的多个正则表达式匹配

python - 检查 SQLAlchemy 列的属性?