我有一个tqdm进度条:
print('foo')
for status in tqdm(cursor.items(count)):
#process status
pass
在循环之前,我打印了一些消息,但进度条在它们之前显示了。是否有任何多线程的方法或如何解决此问题?
print
默认打印到sys.stdout
,而tqdm
默认打印到sys.stderr
,这使它们不同步。file=sys.stdout
给tqdm
或指定file=sys.sterr
给print
来使两者都打印到相同的流中,或者在每次调用tqdm
之前调用sys.stdout.flush
并在之后调用sys.stderr.flush
。我可以报告一下在Windows 10上,有几种解决方案对我有用。我也遇到了tqdm的进度条输出被先于tqdm执行的print打断的问题。 对我有效的解决方案是:
sys.stdout.flush()
flush=True
tqdm可以在线程中工作(这很好,因为应用程序不会因为进度条而卡住),因此进度条会在打印之前显示。
由于机器看到print是一个IO操作,所以机器会优先考虑tqdm。
您需要在循环之前和之后睡眠。为此,请在循环之前和之后使用time.sleep(x)
(x以秒为单位)来解决问题。请记得在代码开头导入time
。尝试使用不同的x值进行实验,但只需0.1即可正常工作。
flush
关键字参数来强制输出,例如:print("foo", flush=True)
。 - Copperfieldtime.sleep
。 - HelloGoodbyeflush=True
却有效(我使用的是Windows)。 - eric