【问题标题】:Using tqdm with subprocess将 tqdm 与子进程一起使用
【发布时间】:2023-07-23 04:07:02
【问题描述】:

我正在尝试为我参与的开源项目添加进度条功能。该软件以易于使用的方式将多线程命令传递给它。目前,我正在尝试向应用程序添加进度条功能,但是无法让进度条保持在底部并进行更新。

我们正在使用以下代码来处理命令:

subprocess.call(task, shell=True)

我目前使用tqdm.update() 来更新栏的进度,但是这会一直在新行上打印,使终端看起来很糟糕。

要确切了解我们如何使用 tqdm 包,请查看以下链接: https://github.com/codingo/Interlace/blob/master/Interlace/lib/threader.py

最后,我们对这个应用程序的目标是在终端底部设置一个进度条,这样它就不会影响输出并且看起来相当干净。任何帮助,将不胜感激!

【问题讨论】:

  • 请不要指望人们离开现场来回答您的问题。如果可以的话,发布一个对其他有同样问题的人有用的最小示例。

标签: python python-3.x tqdm


【解决方案1】:

通过更改以下内容来修复问题:

    @staticmethod
    def run_task(task):
        subprocess.call(task, shell=True)

进入:

    @staticmethod
    def run_task(task, t):
        s = subprocess.Popen(task, shell=True, stdout=subprocess.PIPE)
        t.write(s.stdout.readline().decode("utf-8"))

这基本上允许我们将任务的所有输出通过管道传输到标准输出,然后使用 UTF-8 解码字节并使用 tqdm.write() 打印出来

工作就像一个魅力!

【讨论】: