【问题标题】:tqdm in Jupyter Notebook prints new progress bars repeatedlyJupyter Notebook 中的 tqdm 重复打印新的进度条
【发布时间】:2017-07-01 22:55:39
【问题描述】:

我正在使用 tqdm 在 Jupyter 笔记本中运行的脚本中打印进度。我正在通过tqdm.write() 将所有消息打印到控制台。然而,这仍然给我一个像这样的倾斜输出:

也就是说,每次必须打印新行时,都会在下一行打印一个新的进度条。当我通过终端运行脚本时,这不会发生。我该如何解决这个问题?

【问题讨论】:

标签: python jupyter-notebook tqdm


【解决方案1】:

另一个使用 tqdm 的进度条示例

      from tqdm import tqdm
      my_list = list(range(100))
      with tqdm(total=len(my_list)) as pbar:
          for x in my_list:
             pbar.update(1)

【讨论】:

    【解决方案2】:

    以上都不适合我。我发现在错误后运行以下排序此问题(它只是清除后台进度条的所有实例):

    from tqdm import tqdm
    
    # blah blah your code errored
    
    tqdm._instances.clear()
    

    【讨论】:

    • 谢谢!但是,如果不存在实例,它会抛出错误。仍然想将它与脚本和 Hydrogen IDE 一起使用。这是我的代码。 try: # Avoids problem on notebooks / Hydrogen IDE tqdm.tqdm._instances.clear() except Exception: pass
    • 是的,如果不存在实例,它会抛出异常。你的尝试除了方法有问题吗?
    【解决方案3】:

    尝试使用tqdm.notebook.tqdm 代替tqdm,如here 所述。

    这可以像将导入更改为一样简单:

    from tqdm.notebook import tqdm

    祝你好运!

    编辑:经过测试,tqdm 似乎在 Jupyter 笔记本的“文本模式”下工作正常。很难说,因为您没有提供minimal example,但看起来您的问题是由每次迭代中的打印语句引起的。 print 语句在每个状态栏更新之间输出一个数字(~0.89),这会弄乱输出。尝试删除打印语句。

    【讨论】:

    • 我没有使用print() 声明,我使用了tqdm.write()。但是,tqdm_notebook 给出了很好的结果。谢谢:)
    • 不知道是否支持Python 3.6?我没有运气
    • 您遇到什么错误?这对我来说可以。用这么少的信息无法提供帮助......你有enabled ipywidgets in jupyer吗?你只是简单的tqdm,而不是tqdm_notebook?这适用于 Python 3.6 和 Jupyter 1.0.0。
    • tqdm 4.19.4 中的 tqdm_notebook 在 Python 3.6、Jupyter notebook 5.0.0 和 ipywidgets 7.0.3 上为我工作。
    • 这似乎是最简单的方法:from tqdm.autonotebook import tqdm
    【解决方案4】:

    使用 tqdm_notebook

    from tqdm import tqdm_notebook as tqdm
    
    x=[1,2,3,4,5]
    
    for i in tqdm(range(0,len(x))):
    
        print(x[i])
    

    【讨论】:

      【解决方案5】:

      适用于所有在 Windows 上使用此处提到的任何解决方案都无法解决重复条问题的人。我必须按照tqdm's known issues 中的说明安装colorama 包,该包已修复。

      pip install colorama
      

      试试这个例子:

      from tqdm import tqdm
      from time import sleep
      
      for _ in tqdm(range(5), "All", ncols = 80, position = 0):
          for _ in tqdm(range(100), "Sub", ncols = 80, position = 1, leave = False):
              sleep(0.01)
      

      这会产生类似的东西:

      All:  60%|████████████████████████                | 3/5 [00:03<00:02,  1.02s/it]
      Sub:  50%|██████████████████▌                  | 50/100 [00:00<00:00, 97.88it/s]
      

      【讨论】:

        【解决方案6】:

        如果此处的其他提示不起作用并且 - 就像我一样 - 您正在通过 progress_apply 使用 pandas 集成,您可以让 tqdm 处理它:

        from tqdm.autonotebook import tqdm
        tqdm.pandas()
        
        df.progress_apply(row_function, axis=1)
        

        这里的重点在于tqdm.autonotebook 模块。正如their instructions for use in IPython Notebooks 中所述,这使得tqdm 在 Jupyter 笔记本和 Jupyter 控制台中使用的进度条格式之间进行选择 - 由于我方面仍然缺乏进一步调查的原因,tqdm.autonotebook 选择的特定格式在pandas 中运行顺利,而所有其他人都没有,特别是 progress_apply

        【讨论】:

          【解决方案7】:

          现在大多数答案都已过时。如果您正确导入 tqdm 会更好。

          from tqdm import tqdm_notebook as tqdm
          

          【讨论】:

          • 又变了:TqdmDeprecationWarning: This function will be removed in tqdm==5.0.0 Please use tqdm.notebook.tqdm instead of tqdm.tqdm_notebook
          【解决方案8】:

          要完成 oscarbranson 的回答:可以根据运行的位置自动选择控制台或笔记本版本的进度条:

          from tqdm.autonotebook import tqdm
          

          更多信息可以找到here

          【讨论】:

            【解决方案9】:

            这是 tqdm_notebook 不适合您的情况的替代答案。

            举个例子:

            from time import sleep
            from tqdm import tqdm
            
            values = range(3)
            with tqdm(total=len(values)) as pbar:
                for i in values:
                    pbar.write('processed: %d' %i)
                    pbar.update(1)
                    sleep(1)
            

            输出看起来像这样(进度会显示为红色):

              0%|          | 0/3 [00:00<?, ?it/s]
            processed: 1
             67%|██████▋   | 2/3 [00:01<00:00,  1.99it/s]
            processed: 2
            100%|██████████| 3/3 [00:02<00:00,  1.53it/s]
            processed: 3
            

            问题在于 stdoutstderr 的输出是异步处理的,并且按照换行符分开处理。

            如果说 Jupyter 在 stderr 上接收第一行,然后在 stdout 上接收“已处理”输出。然后,一旦它在 stderr 上接收到输出以更新进度,它就不会返回并更新第一行,因为它只会更新最后一行。相反,它必须写一个新行。

            解决方法 1,写入标准输出

            一种解决方法是将两者都输出到标准输出:

            import sys
            from time import sleep
            from tqdm import tqdm
            
            values = range(3)
            with tqdm(total=len(values), file=sys.stdout) as pbar:
                for i in values:
                    pbar.write('processed: %d' % (1 + i))
                    pbar.update(1)
                    sleep(1)
            

            输出将变为(不再是红色):

            processed: 1   | 0/3 [00:00<?, ?it/s]
            processed: 2   | 0/3 [00:00<?, ?it/s]
            processed: 3   | 2/3 [00:01<00:00,  1.99it/s]
            100%|██████████| 3/3 [00:02<00:00,  1.53it/s]
            

            在这里我们可以看到 Jupyter 似乎直到行尾才清除。我们可以通过添加空格来添加另一种解决方法。如:

            import sys
            from time import sleep
            from tqdm import tqdm
            
            values = range(3)
            with tqdm(total=len(values), file=sys.stdout) as pbar:
                for i in values:
                    pbar.write('processed: %d%s' % (1 + i, ' ' * 50))
                    pbar.update(1)
                    sleep(1)
            

            这给了我们:

            processed: 1                                                  
            processed: 2                                                  
            processed: 3                                                  
            100%|██████████| 3/3 [00:02<00:00,  1.53it/s]
            

            解决方法 2,改为设置描述

            一般来说,没有两个输出而是更新描述可能更直接,例如:

            import sys
            from time import sleep
            from tqdm import tqdm
            
            values = range(3)
            with tqdm(total=len(values), file=sys.stdout) as pbar:
                for i in values:
                    pbar.set_description('processed: %d' % (1 + i))
                    pbar.update(1)
                    sleep(1)
            

            输出(处理时更新描述):

            processed: 3: 100%|██████████| 3/3 [00:02<00:00,  1.53it/s]
            

            结论

            你可以让它在普通的 tqdm 上正常工作。但如果 tqdm_notebook 对你有用,就使用它(但你可能不会读那么远)。

            【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-01-09
            • 2018-11-17
            • 1970-01-01
            • 1970-01-01
            • 2019-08-15
            • 1970-01-01
            相关资源
            最近更新 更多