首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >tqdm和print / for不能正常工作(对于第一个日志记录/ print语句没有换行)

tqdm和print / for不能正常工作(对于第一个日志记录/ print语句没有换行)
EN

Stack Overflow用户
提问于 2022-10-27 12:37:46
回答 1查看 84关注 0票数 1

下面是一个最小的可重现性示例:

代码语言:javascript
运行
复制
import logging
from tqdm import tqdm

for i in tqdm(range(1000)):
    for _ in range(2000):
        a = i+8
    if i % 100 == 0:
        logging.warning("test")

这将产生以下结果:

代码语言:javascript
运行
复制
  0%|          | 0/1000 [00:00<?, ?it/s]WARNING:root:test
WARNING:root:test
WARNING:root:test
WARNING:root:test
WARNING:root:test
WARNING:root:test
WARNING:root:test
WARNING:root:test
WARNING:root:test
WARNING:root:test
100%|██████████| 1000/1000 [00:00<00:00, 996982.17it/s]

我可以再次刷新和打印条形(基本上没有参数leave=True ),但是第一个警告没有中断。它对print("test")也不是很好

代码语言:javascript
运行
复制
  0%|          | 0/1000 [00:00<?, ?it/s]test
test
test
test
test
test
test
test
test
test
100%|██████████| 1000/1000 [00:00<00:00, 20526.40it/s]

知道如何为第一次打印/日志设置适当的行间隔吗?我不能添加"\n“,因为否则,对于以下打印消息,我将有太多的换行符。并且添加一个“如果这是第一条消息,那么添加"\n”否则不“听起来像一个肮脏的方式绕过这个问题。

我看过这篇文章(tqdm with logger on separate lines),但除了“自己做自己的tqdm”之外,这不是什么答案,因为我喜欢做tqdm(my_iterable)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-02 07:10:15

在将输出写入stdout或stderr之前,可以通过调用tqdm对象的tqdm方法来清除状态栏。

要使对clear方法的调用对每个输出自动进行,您可以创建一个上下文管理器,它用一个包装器函数对sys.stdoutsys.stderr进行修补,该包装函数在将消息写入原始sys.stderr之前调用给定tqdm对象的clear方法。

代码语言:javascript
运行
复制
import sys
from unittest.mock import patch
from contextlib import contextmanager

@contextmanager
def tqdm_output(tqdm, write=sys.stderr.write):
    def wrapper(message):
        if message != '\n':
            tqdm.clear()
        write(message)
        if '\n' in message:
            tqdm.display()

    with patch('sys.stdout', sys.stderr), patch('sys.stderr.write', wrapper):
        yield tqdm

这样,您就可以将迭代放在上下文管理器中,并正常使用记录器:

代码语言:javascript
运行
复制
with tqdm_output(tqdm(range(1000))) as trange:
    for i in trange:
        if i % 100 == 0:
            logging.warning("test")

它的输出是:

代码语言:javascript
运行
复制
WARNING:root:test                                                        
WARNING:root:test
WARNING:root:test                                                        
WARNING:root:test
WARNING:root:test                                                        
WARNING:root:test
WARNING:root:test
WARNING:root:test                                                        
WARNING:root:test
WARNING:root:test                                                        
100%|██████████████████████████████| 1000/1000 [00:00<00:00, 1797.66it/s]

与使用print相同

代码语言:javascript
运行
复制
with tqdm_output(tqdm(range(1000))) as trange:
    for i in trange:
        if i % 100 == 0:
            print('test')

其中产出:

代码语言:javascript
运行
复制
test                                                                     
test                                                                     
test                                                                     
test                                                                     
test                                                                     
test                                                                     
test                                                                     
test                                                                     
test                                                                     
test                                                                     
100%|███████████████████████████████| 1000/1000 [00:05<00:00, 181.55it/s]

演示:https://replit.com/@blhsing/GentleShallowScan

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74222161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档