我有一个tqdm进度条:
print('foo')
for status in tqdm(cursor.items(count)):
#process status
pass
我在循环之前打印了一些消息,但进度条显示在它们之前。是否有任何类型的多线程或我如何解决这个问题?
答案 0 :(得分:1)
tqdm在一个线程中工作(由于进度条,应用程序不会卡住,这很好),因此在打印之前会显示进度条。
当机器发现打印是IO动作时,机器优先考虑tqdm。
你需要在循环之前和之后睡觉。为此,请在循环之前和之后使用time.sleep(x)
(x以秒为单位)来解决问题。请记住代码开头的import time
。尝试使用不同的x值,但只有0.1可能会正常工作。
答案 1 :(得分:0)
问题是默认情况下print
会在tqdm
by default prints to sys.stderr
时打印到sys.stdout
,这会使它们失去同步。
您可以指定file=sys.stdout
至tqdm
或指定file=sys.sterr
至print
以使两者都打印到相同的流,或者您可以先调用sys.stdout.flush
每次致电sys.stderr.flush
后{和tqdm
。
答案 2 :(得分:0)
我可以报告在Windows 10上我报告的几个解决方案是如何为我工作的。我也遇到了tqdm之前执行的打印中断tqdm条形输出的问题。 对我有用的解决方案是
sys.stdout.flush()
没有的是
的印刷品flush=True
我认为sys.stdout.flush是最好的,因为它确实需要做什么... stdout上的输出需要刷新,以便在stderr上第一次输出tqdm之前完成。最基本的I / O问题。
我喜欢这个小小部件能够为stdio这个无聊的世界带来一点优雅。