首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否可以在使用nohup时刷新tqdm输出?

是否可以在使用nohup时刷新tqdm输出?
EN

Stack Overflow用户
提问于 2022-10-03 13:51:23
回答 1查看 143关注 0票数 1

我使用python包来显示代码的执行进度。这里有一个小示例,可以更好地解释我的用例。

代码语言:javascript
运行
复制
progress = tqdm(range(2))
for epoch in progress:
    loss = []
    for i in range(2):
        time.sleep(0.5)
        loss_ = random.random()
        progress.set_description("EPOCH: {}, LOSS: {}".format(epoch, loss_))
        loss.append(loss_)
    loss_mean = sum(loss) / len(loss)
    print("EPOCH: {}, LOSS: {}".format(epoch, loss_mean))

当我在没有nohup的情况下运行这段代码时,它会像我预期的那样运行。它刷新tqdm描述,并且只将最后一个保存在终端上。样本输出

代码语言:javascript
运行
复制
EPOCH: 0, LOSS: 0.9789279434307936:   0%|                                                 | 0/2 [00:01<?, ?it/s]
EPOCH: 0, LOSS: 0.5650528466113542
EPOCH: 1, LOSS: 0.2959674437384582:  50%|████████████████████▌                    | 1/2 [00:02<00:01,  1.00s/it]
EPOCH: 1, LOSS: 0.39633745424290057
EPOCH: 1, LOSS: 0.2959674437384582: 100%|█████████████████████████████████████████| 2/2 [00:02<00:00,  1.00s/it]

但是,当我使用nohup在后台运行相同的代码时,内部循环中的所有tqdm描述都会被打印出来,而print语句的输出将在最后被打印出来。以下是使用nohup时的输出。

代码语言:javascript
运行
复制
  0%|          | 0/2 [00:00<?, ?it/s]
EPOCH: 0, LOSS: 0.6247515429741374:   0%|          | 0/2 [00:00<?, ?it/s]
EPOCH: 0, LOSS: 0.531051885429166:   0%|          | 0/2 [00:01<?, ?it/s]
EPOCH: 0, LOSS: 0.531051885429166:  50%| ^v^h ^v^h ^v^h ^v^h ^v^h     | 1/2 [00:01<00:01,  1.00s/it]
EPOCH: 1, LOSS: 0.4399544030856224:  50%| ^v^h ^v^h ^v^h ^v^h ^v^h     | 1/2 [00:01<00:01,  1.00s/it]
EPOCH: 1, LOSS: 0.6654644291991813:  50%| ^v^h ^v^h ^v^h ^v^h ^v^h     | 1/2 [00:02<00:01,  1.00s/it]
EPOCH: 1, LOSS: 0.6654644291991813: 100%| ^v^h ^v^h ^v^h ^v^h ^v^h ^v^h ^v^h ^v^h ^v^h ^v^h| 2/2 [00:02<00:00, >
EPOCH: 1, LOSS: 0.6654644291991813: 100%| ^v^h ^v^h ^v^h ^v^h ^v^h ^v^h ^v^h ^v^h ^v^h ^v^h| 2/2 [00:02<00:00, >
EPOCH: 0, LOSS: 0.5779017142016517
EPOCH: 1, LOSS: 0.5527094161424018

因此,我想知道是否有可能从文件中清空/擦除以前的tqdm输出(只保留最后的描述),从而在没有nohup的情况下模拟执行时的最终输出。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-03 14:28:36

不是的。

请理解,在nohup下,您没有一个pty,一个终端,它只将sys.stdout连接到文件nohup.out。通常,tqdm不完全“擦除”,而是打印一行进度输出,后面是\r返回,而不是\n NEWLINE。重复这样做会产生覆盖同一行的视觉效果。但是输出了许多字符,它们都出现在文本输出文件中。

您的抱怨是,“嘈杂”的tqdm输出干扰其他输出,您希望看到更少的噪音。要做到这一点,要么向应用程序添加一个选项,使其根本不调用tqdm,要么确保应用程序将其输出写入其他文件描述符。然后,当您cat该文件时,您将看不到任何进度输出。

你现在有

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

        ...
        for item in tqdm(items):
            do_stuff(item)

您可以创建自己的def tqdm(...):包装器,它有条件地调用“真正的”tqdm。如果用户提供的选项或isatty()表示我们不希望看到进度输出,那么包装器可以选择静默返回,而不是传递到tqdm调用。

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

https://stackoverflow.com/questions/73936454

复制
相关文章

相似问题

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