【问题标题】:Preventing tqdm from printing anything after error防止 tqdm 在出错后打印任何内容
【发布时间】:2020-08-12 09:29:34
【问题描述】:

在 tqdm 循环中处理错误时,我希望错误消息是最后打印的内容。一个 MWE:

import tqdm
import sys

for i in tqdm.tqdm(range(10)):

    if i == 3:

        print('error')

        sys.exit(1)

运行此程序时,tqdm 仍会在“错误”消息后打印进度条。是否有可能避免这种情况(因此“错误”是最后显示的内容)?

编辑:我实际上是从对 tqdm 一无所知的不同外部模块调用 sys.exit,并且我不想在 tqdm 对象中有一个全局变量。可能是我要求太多了……

干杯。

【问题讨论】:

  • 这看起来像是一个非常人为的例子。你能举一个更现实的例子吗?如何最好地处理错误取决于您使用的实际控制流。
  • 我刚刚添加了一个编辑:我实际上正在这样做,但 sys.exit 位于不同的模块中。

标签: python tqdm


【解决方案1】:

是的。 致电close() 并确保leave 为False。

见:https://tqdm.github.io/docs/tqdm/#close

【讨论】:

  • 感谢您的快速回复!问题是在上面的例子中,一切都发生在同一个模块内(这里是 main),但是我的“sys.exit()”s 发生在其他模块中(对 tqdm 一无所知),我不喜欢这个想法 o a global 变量与 tqdm 对象...但这可能是唯一的方法。
【解决方案2】:

您可以将tqdm 实例存储在变量中并手动更新。

progress_bar = tqdm(total=10)
for i in range(10):
    progress_bar.update()
    
    do_stuff()

    if i ==3:
        progress_bar.close()
        print('error')
        sys.exit(1)

您可以使用tqdm.trange 作为上下文管理器来消除手动更新的需要,但仍然提供关闭它的方法。见https://github.com/tqdm/tqdm#description-and-additional-stats

请注意,如果您退出上下文管理器,它将运行其“finally”部分并关闭 tqdm 实例。

【讨论】:

  • 谢谢!!在我的情况下,leave=False 就足够了(我的错:我虽然 leave=False 是默认值)
猜你喜欢
  • 1970-01-01
  • 2019-05-26
  • 2021-02-13
  • 1970-01-01
  • 1970-01-01
  • 2012-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多