在执行之前显示tqdm状态栏

6

我有一个tqdm进度条:

print('foo')
for status in tqdm(cursor.items(count)):
    #process status
    pass

在循环之前,我打印了一些消息,但进度条在它们之前显示了。是否有任何多线程的方法或如何解决此问题?

3个回答

4
问题在于print默认打印到sys.stdout,而tqdm默认打印到sys.stderr,这使它们不同步。
您可以通过指定file=sys.stdouttqdm或指定file=sys.sterrprint来使两者都打印到相同的流中,或者在每次调用tqdm之前调用sys.stdout.flush并在之后调用sys.stderr.flush

1

我可以报告一下在Windows 10上,有几种解决方案对我有用。我也遇到了tqdm的进度条输出被先于tqdm执行的print打断的问题。 对我有效的解决方案是:

sys.stdout.flush()

那个没有做到的是对打印的添加。
flush=True

我认为sys.stdout.flush是目前最好的选择,因为这正是需要做的事情...stdout上的输出需要被刷新,以便在tqdm的第一个stderr输出之前完成...这是最基本的I/O问题。
我喜欢这个小部件为stdio带来一点优雅的能力。

-1

tqdm可以在线程中工作(这很好,因为应用程序不会因为进度条而卡住),因此进度条会在打印之前显示。

由于机器看到print是一个IO操作,所以机器会优先考虑tqdm。

您需要在循环之前和之后睡眠。为此,请在循环之前和之后使用time.sleep(x)(x以秒为单位)来解决问题。请记得在代码开头导入time。尝试使用不同的x值进行实验,但只需0.1即可正常工作。


3
你也可以尝试使用print函数的flush关键字参数来强制输出,例如:print("foo", flush=True) - Copperfield
它似乎在Windows上无法工作,但比等待更优雅。 - user6216224
这不是打印输出结果顺序错误的原因,而且固定时间睡眠可能仍然在某些情况下失败,具体取决于Python处理打印到终端的各种命令的速度(即使在此MWE中,睡眠可能仍然有效)。请参见我的答案,其中提供了一种解决方案,您无需使用time.sleep - HelloGoodbye
这个解决方案对我无效,但是在我的打印语句中添加 flush=True 却有效(我使用的是Windows)。 - eric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接