我使用python包来显示代码的执行进度。这里有一个小示例,可以更好地解释我的用例。
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描述,并且只将最后一个保存在终端上。样本输出
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时的输出。
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的情况下模拟执行时的最终输出。
发布于 2022-10-03 14:28:36
不是的。
请理解,在nohup
下,您没有一个pty,一个终端,它只将sys.stdout
连接到文件nohup.out
。通常,tqdm不完全“擦除”,而是打印一行进度输出,后面是\r
返回,而不是\n
NEWLINE。重复这样做会产生覆盖同一行的视觉效果。但是输出了许多字符,它们都出现在文本输出文件中。
您的抱怨是,“嘈杂”的tqdm输出干扰其他输出,您希望看到更少的噪音。要做到这一点,要么向应用程序添加一个选项,使其根本不调用tqdm,要么确保应用程序将其输出写入其他文件描述符。然后,当您cat
该文件时,您将看不到任何进度输出。
你现在有
from tqdm import tqdm
...
for item in tqdm(items):
do_stuff(item)
您可以创建自己的def tqdm(...):
包装器,它有条件地调用“真正的”tqdm。如果用户提供的选项或isatty()表示我们不希望看到进度输出,那么包装器可以选择静默返回,而不是传递到tqdm调用。
https://stackoverflow.com/questions/73936454
复制相似问题