Как я могу изменить STDOUT? - PullRequest
       10

Как я могу изменить STDOUT?

1 голос
/ 20 декабря 2011

В настоящее время я пишу очень простой инструмент терминала и хочу реализовать следующее поведение:

Терминал должен отображать:

Downloading "Something" ...

И после того, как я завершу загрузку,Я хочу заменить эту строку на:

Downloading "Something" [Done]

Я видел, как это сделано, чтобы создать следующую анимацию:

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

Поскольку у меня нет большого опыта работы с инструментами терминала, яне знаю, как реализовать это простое поведение.Любая помощь будет принята с благодарностью.

Ответы [ 5 ]

3 голосов
/ 20 декабря 2011

Завершить промежуточную версию строки с "\ r".Любая последующая запись перезапишет эту строку (при условии, что новая запись будет, по крайней мере, такой же, как оригинал).

Был похожий вопрос не так давно;см. мой ответ , например, код на C ++.

3 голосов
/ 20 декабря 2011

Используйте символ возврата на одну позицию - \b.

Не забудьте очистить выходной поток, он, вероятно, буферизован.

2 голосов
/ 20 декабря 2011

Хотя верно, что '\b' не сложно использовать для удаления предыдущего значения в python (посмотрите на ответы на этот вопрос ). Я рекомендую вам использовать 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, ...), если позже захотите сделать индикатор выполнения лучше в зависимости от ваших потребностей.

2 голосов
/ 20 декабря 2011

Попробуйте:

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

Магический трюк достигается с помощью "\ r" (CR): P.

2 голосов
/ 20 декабря 2011

Если это терминал ANSI, вы можете использовать ANSI Escape Sequence , чтобы переместить курсор назад на строку или любую другую позицию по этому вопросу.Затем вы можете редактировать, начиная с позиции, в которую вы поместили курсор.

...