为啥 tqdm 已经落地的历史日志,使用 tail 查看时依然会把进程从 0 到 100 再打印一遍?

2023-08-01 10:45:45 +08:00
 Morriaty

代码里的调用

for i in tqdm(generator(), total=gr.size, desc="writing"):

然后在 shell 里再重定向到log_file

python3 script.py >> log_file 2>&1

这是个 cron 定时脚本,第二天等这个脚本执行结束后,用 tail 去查看

tail -100 log_file

然后发现竟然会把进程条从 0 到 100 再打印一遍,这是为啥呢? 就是它为啥不是直接显示的 100%进度条呢?

补充说明下: 它不是梯形打印

writing: 10%|█                  | 2230000/2430799 [1:22:45<5:22:45, 125.52it/s]
writing: 30%|██              | 6230000/2430799 [3:22:45<5:22:45, 125.52it/s]
writing: 50%|███           | 10230000/2430799 [3:22:45<5:22:45, 125.52it/s]

而是在单行里一直从 0 打印到 100

1177 次点击
所在节点    Python
5 条回复
thinszx
2023-08-01 10:50:41 +08:00
输出是不是没有换行符?可能文件里都是一行?
Morriaty
2023-08-01 11:05:13 +08:00
@thinszx 是一行,但我的问题是,为什么不是只直接打印 100%这一行的结果,而实际情况是它在一行里把 0%-100%这个过程又重复了一遍
thinkershare
2023-08-01 11:21:41 +08:00
tqdm 不适合重定向,但对输出做了刷新,重定向收到网络和 I/O 的影响,会出现各种乱七八糟的结果。
cbythe434
2023-08-01 11:33:08 +08:00
tqdm 输出的是\r
换行(\r ):每次光标移到本行的行首位置处
tail 是看\n 的,必须所有\r 刷完
tinytoadd
2023-08-01 11:44:57 +08:00
终端的动态效果都是由控制字符实现的

可以看看这篇博客
https://poor.dev/blog/terminal-anatomy/

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/961424

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX