如何修改STDOUT?

时间:2011-12-20 05:47:21

标签: python c bash terminal stdout

我目前正在编写一个非常简单的终端工具,我想实现以下行为。

终端应显示:

Downloading "Something" ...

完成下载后,我想用以下内容替换该行:

Downloading "Something" [Done]

我已经看到这样做了o创建以下动画:

[-]
[\]
[|]
[/]

由于我对终端工具没有太多经验,我不知道如何实现这个简单的行为。任何帮助将不胜感激。

5 个答案:

答案 0 :(得分:3)

使用退格符 - \b

不要忘记刷新输出流,它可能是缓冲的。

答案 1 :(得分:3)

使用“\ r \ n”终止该行的中间版本。任何后续写入都将覆盖该行(只要新写入至少与原始写入一样长。)

不久前有a similar question;有关C ++中的代码,请参阅my answer there

答案 2 :(得分:2)

如果它是ANSI终端,您可以使用ANSI Escape Sequences将光标移回一行或任何其他位置。然后,您可以从光标所在的位置开始编辑。

答案 3 :(得分:2)

试试这个:

void test() {
    const char *msg = "Downloading %s%s";
    printf(msg, "file", "...\r");
    printf(msg, "file", "[Done]\n");
}

使用“\ r”(CR)来实现神奇的技巧:P。

答案 4 :(得分:2)

虽然使用'\b'删除python中的先前值并不困难(查看this question的答案)。我建议您使用python-progressbar

from progressbar import ProgressBar, RotatingMarker
import time

widgets = ['Downloading something... [', RotatingMarker(), ']']

maxval = 10
progressbar = ProgressBar(widgets=widgets, maxval=maxval).start()
for i in range(maxval):
    progressbar.update(i)
    # Do something                               
    time.sleep(0.2)
widgets[-2] = 'Done'
progressbar.finish()

原因不仅在于您可以轻松地执行您正在寻找的内容,而且还可以添加其他小部件(ETA,FileTransferSpeed,Percentage,...),如果您希望以后使进度条看起来像根据您的需求更好。