You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用nohup运行Python代码时,能否刷新tqdm输出并清除历史记录?

问题:nohup后台运行时如何让tqdm仅保留最后一条输出?

我用Python的tqdm包展示代码执行进度,示例代码如下:

import tqdm
import time
import random

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))

直接在终端运行时,tqdm会刷新描述,终端仅保留最后一条记录;但用nohup后台运行时,内循环的所有tqdm描述都会被打印出来,print语句的输出则在最后。想知道能不能清除文件中的tqdm历史输出,只保留最后一条描述,模拟直接运行时的效果。


解决方法

方法1:指定tqdm输出到标准错误流

tqdm在交互式终端会自动处理刷新,但nohup重定向输出到文件时会丢失终端交互特性。可以强制让tqdm输出到标准错误流(stderr),利用终端的刷新机制保留最后一条描述,同时将print内容输出到标准输出(stdout)分离保存。修改代码如下:

import tqdm
import time
import random
import sys

# 指定file参数为sys.stderr,沿用终端刷新逻辑
progress = tqdm.tqdm(range(2), file=sys.stderr)
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 python your_script.py > output.log 2>&1 &,tqdm的刷新内容会在终端(或nohup错误流)仅保留最后一条,print的结果则写入output.log。

方法2:手动控制输出覆盖

如果要将所有输出写入同一文件,可以禁用tqdm自动输出,用回车符\r回到行首覆盖历史内容,结合flush()确保实时写入:

import tqdm
import time
import random
import sys

# 禁用tqdm自动输出,手动控制内容
progress = tqdm.tqdm(range(2), disable=True)
for epoch in progress:
    loss = []
    for i in range(2):
        time.sleep(0.5)
        loss_ = random.random()
        # 回车回到行首,覆盖之前的输出
        sys.stdout.write("\rEPOCH: {}, LOSS: {}".format(epoch, loss_))
        sys.stdout.flush()
        loss.append(loss_)
    loss_mean = sum(loss) / len(loss)
    # 换行后输出最终结果,避免被后续内容覆盖
    print("\nEPOCH: {}, LOSS: {}".format(epoch, loss_mean))

这种方式下,输出文件中只会保留tqdm的最后一条描述和每个epoch的最终结果。

方法3:用tail实时查看最新内容

如果不想修改代码,可在后台运行后用tail命令只查看文件的最后几行,模拟终端刷新效果:

nohup python your_script.py > output.log &
tail -f output.log

注意:原始输出文件仍会保留所有tqdm历史记录,仅查看时只显示最新内容。


内容的提问来源于stack exchange,提问作者Monish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 01:35:29