【问题标题】:Suppress tqdm output in Linux "screen" command log抑制 Linux“屏幕”命令日志中的 tqdm 输出
【发布时间】:2020-07-09 18:53:48
【问题描述】:

我有一个脚本,它使用 tqdm 为冗长的处理工作流程制作多个进度条。由于这个过程很长,我在 Linux 中使用“screen”命令将它作为一个分离的进程运行。我通过类似于以下的命令将输出保存到日志文件:

screen -dm -L sh -c 'python3 myscript.py'

因为输出还会包含一些对事后分析很有价值的报告。

但问题是屏幕上的输出日志文件被许多增量重新打印的加载条严重污染。但我确实喜欢能够在终端中重新附加该进程,以便我可以间歇性地监控它的进度。所以我不想完全放弃 tqdm。

有没有办法在事后抑制日志文件中的 tqdm 输出,同时在运行时仍然显示“实时”?

【问题讨论】:

  • 您可以将主要输出写入标准输出,并让 tqdm 写入标准错误。然后仅将标准输出重定向到文件(参见例如tee)。添加为评论,因为我不知道如何让 tqdm 使用标准错误。顺便说一句,我认为您可以从您的问题中删除 screen 并且它不会改变本质。
  • @Norrius 你是对的,我发现 tqdm 默认使用标准错误,可能正是这种情况。因此,只需在屏幕上运行tee 中的命令即可获得所需的效果(例如screen -dm -L sh -c 'python3 myscript.py | tee out.log | less')。如果您想发布此提示作为答案,我会接受。
  • 我很高兴听到它成功了!随意发布答案(并接受它),这完全可以。也许它会在未来对其他人有所帮助。

标签: python gnu-screen tqdm


【解决方案1】:

这可能是由于 screen 不是 UTF-8 字符友好。尝试使用 -U 参数调用屏幕:screen -U -r <number> 此外,在调用tqdm 时,尝试包含参数ascii=True 以处理不支持UTF-8 的屏幕。如下所示:

for item in tqdm(items, total=len(items), ascii=True):
        pass

对于您的情况,在调用tqdm 时使用position 参数设置进度条的位置也是一个好习惯。

【讨论】:

    猜你喜欢
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    相关资源
    最近更新 更多