79 votes

Comment animer la ligne de commande ?

Je me suis toujours demandé comment les gens mettent à jour une ligne précédente dans une ligne de commande. Un excellent exemple de ceci est l'utilisation de la commande wget sous linux. Elle crée une sorte de barre de chargement ASCII qui ressemble à ceci :

[======> ] 37%

et bien sûr, la barre de chargement bouge et le pourcentage change, mais cela ne crée pas une nouvelle ligne. Je n'arrive pas à comprendre comment faire. Quelqu'un peut-il m'indiquer la bonne direction ?

57voto

Greg Hewgill Points 356191

Une façon de procéder est de mettre à jour de façon répétée la ligne de texte avec la progression actuelle. Par exemple :

def status(percent):
    sys.stdout.write("%3d%%\r" % percent)
    sys.stdout.flush()

Notez que j'ai utilisé sys.stdout.write au lieu de print (c'est Python) car print imprime automatiquement " \r\n " (carriage-return new-line) à la fin de chaque ligne. Je veux juste le carriage-return qui renvoie le curseur au début de la ligne. De même, le flush() est nécessaire car par défaut, sys.stdout ne purge sa sortie qu'après une nouvelle ligne (ou lorsque son tampon est plein).

43voto

hazzen Points 7315

Il y a deux façons de le faire, à ma connaissance :

  • Utilisez le caractère d'échappement backspace (' \b ') pour effacer votre ligne
  • Utilisez le curses si votre langage de programmation de prédilection possède des liens avec celui-ci.

Et un Google a révélé Codes d'échappement ANSI qui semblent être une bonne méthode. Pour référence, voici une fonction en C++ pour faire cela :

void DrawProgressBar(int len, double percent) {
  cout << "\x1B[2K"; // Erase the entire current line.
  cout << "\x1B[0E"; // Move to the beginning of the current line.
  string progress;
  for (int i = 0; i < len; ++i) {
    if (i < static_cast<int>(len * percent)) {
      progress += "=";
    } else {
      progress += " ";
    }
  }
  cout << "[" << progress << "] " << (static_cast<int>(100 * percent)) << "%";
  flush(cout); // Required.
}

4voto

hustljian Points 209

Voici ma réponse : utilisez l'API Windows Consoles(Windows) codage de C.

/*
* file: ProgressBarConsole.cpp
* description: a console progress bar Demo
* author: lijian <hustlijian@gmail.com>
* version: 1.0
* date: 2012-12-06
*/
#include <stdio.h>
#include <windows.h>

HANDLE hOut;
CONSOLE_SCREEN_BUFFER_INFO bInfo;
char charProgress[80] = 
    {"================================================================"};
char spaceProgress = ' ';

/*
* show a progress in the [row] line
* row start from 0 to the end
*/
int ProgressBar(char *task, int row, int progress)
{
    char str[100];
    int len, barLen,progressLen;
    COORD crStart, crCurr;
    GetConsoleScreenBufferInfo(hOut, &bInfo);
    crCurr = bInfo.dwCursorPosition; //the old position
    len = bInfo.dwMaximumWindowSize.X;
    barLen = len - 17;//minus the extra char
    progressLen = (int)((progress/100.0)*barLen);
    crStart.X = 0;
    crStart.Y = row;

    sprintf(str,"%-10s[%-.*s>%*c]%3d%%", task,progressLen,charProgress, barLen-progressLen,spaceProgress,50);
#if 0 //use stdand libary
    SetConsoleCursorPosition(hOut, crStart);
    printf("%s\n", str);
#else
    WriteConsoleOutputCharacter(hOut, str, len,crStart,NULL);
#endif
    SetConsoleCursorPosition(hOut, crCurr);
    return 0;
}
int main(int argc, char* argv[])
{
    int i;
    hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    GetConsoleScreenBufferInfo(hOut, &bInfo);

    for (i=0;i<100;i++)
    {
        ProgressBar("test", 0, i);
        Sleep(50);
    }

    return 0;
}

3voto

naren Points 1378

Voici la réponse à votre question... (python)

def disp_status(timelapse, timeout):
  if timelapse and timeout:
     percent = 100 * (float(timelapse)/float(timeout))
     sys.stdout.write("progress : ["+"*"*int(percent)+" "*(100-int(percent-1))+"]"+str(percent)+" %")
     sys.stdout.flush()
     stdout.write("\r  \r")

3voto

Steven Murawski Points 6665

PowerShell dispose d'une cmdlet Write-Progress qui crée une barre de progression en console que vous pouvez mettre à jour et modifier au fur et à mesure de l'exécution de votre script.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X