Dim*_*ims 12 python flush pycharm tqdm
我经常看到,tqdm进度条被其他打印件打破,例如:
93%|??????????| 28/30 [00:02<00:00, 13.44it/s]Subject S9
100%|??????????| 30/30 [00:02<00:00, 12.94it/s]
93%|??????????| 28/30 [00:02<00:00, 11.49it/s]Pickling...
100%|??????????| 30/30 [00:02<00:00, 11.47it/s]
Run Code Online (Sandbox Code Playgroud)
这里应该只显示 2 个进度条。尽管如此成功,打印一些文本会以很高的百分比中断进度条,其余的会在之后打印出来。
是否可以以某种方式“刷新”进度条?
我读过,默认情况下会tqdm打印stderr并尝试刷新它
sys.stderr.flush()
Run Code Online (Sandbox Code Playgroud)
但这没有帮助。
以上都是在PyCharm控制台模拟中发生的,所以可以与此相关。
Zay*_*ydH 13
如果没有看到更多的代码,就无法确定这里发生了什么。然而,以下是最可能的解释。
默认情况下,tqdm打印到stderr. 您的报表Subject...和Pickling...正在打印到stdout. 默认情况下,这两个流不同步(我什至不知道是否可以同步它们)。
如果您想tqdm与prints同步,您可以选择路由tqdm到stdout而不是stderr. 这是通过以下方式实现的:
tqdm(xrange(50), file=sys.stdout)
Run Code Online (Sandbox Code Playgroud)
这样您就不需要刷新标准输出。
要一次显式刷新,请使用refresh(). 要在最后显式刷新,如果 tqdm 卡住,您应该调用tqdm.close(self). 例子:
import time
i_range=tqdm(range(5))
for i in i_range:
i_range.refresh()
time.sleep(1)
i_range.close()
Run Code Online (Sandbox Code Playgroud)
更复杂的嵌套循环示例:
progress = tqdm(range(5*3 ) )
for i in range(5):
print '============================='
for j in range(3):
time.sleep(1)
progress.update()
progress.refresh()
progress.close()
Run Code Online (Sandbox Code Playgroud)
请注意, tqdm 有与刷新频率相关的参数:
mininterval : float, 可选 最小进度显示更新间隔 [默认值: 0.1] 秒。maxinterval : float, 可选最大进度显示更新间隔 [默认值: 10] 秒。
我认为你最好的选择(因为 tqdm 有点接管输出)是使用
\n\ntqdm.write
因此,如果您有进度条,您可以使用它来尝试打印,如下所示:
\n\nIn [19]: from tqdm import tqdm\n ...: import time\n ...:\n ...: for i in tqdm(xrange(50)):\n ...: if i & 0x1 == 0:\n ...: tqdm.write(str(i))\n ...: time.sleep(0.5)\n ...:\n0\n2\n4\n6\n8\n10\n12\n 14%|\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x8c | 7/50 [01:50<11:16, 15.73s/it]--------------------------------------------------------------------------- | 11/50 [00:03<00:10, 3.62it/s]\nRun Code Online (Sandbox Code Playgroud)\n\n这应该最终打印并将栏单独保留在底部。
\n\n如果您想明确刷新该栏,您可以尝试tqdm.refresh另外使用:
In [16]: gen = tqdm(xrange(50))\n 0%| | 0/50 [00:00<?, ?it/s]\nIn [17]: for i in gen:\n ...: if i & 0x1 == 0:\n ...: print str(i)\n ...: gen.refresh()\n ...: time.sleep(0.5)\n ...:\n ...:\n ...:\n ...:\n0\n 2%|\xe2\x96\x88\xe2\x96\x8b | 1/50 [00:01<01:17, 1.59s/it]2\n 6%|\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x89 | 3/50 [00:02<00:55, 1.19s/it]4\n 10%|\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x8e | 5/50 [00:02<00:40, 1.10it/s]6\n 14%|\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x8c | 7/50 [00:03<00:30, 1.41it/s]8\n 14%|\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x8c | 7/50 [00:03<\nRun Code Online (Sandbox Code Playgroud)\n\n但正如您所看到的,如果不使用 tqdm.write,您仍然会在打印的栏旁边看到字符。
\n| 归档时间: |
|
| 查看次数: |
15119 次 |
| 最近记录: |