88 votes

Remplacer la sortie de la console en python

Je me demande comment je pourrais créer un de ces compteurs de console astucieux en Python comme dans certains programmes C / C ++.

J'ai une boucle qui fait des choses et la sortie actuelle est dans le sens de:

 Doing thing 0
Doing thing 1
Doing thing 2
...
 

ce qui serait mieux serait d'avoir juste la dernière mise à jour de la ligne;

 X things done.
 

J'ai vu cela dans un certain nombre de programmes de console et je me demande si / comment je ferais cela en Python.

131voto

6502 Points 42700

Une solution simple consiste simplement à écrire "\r" avant la chaîne et à ne pas ajouter de nouvelle ligne; si la chaîne ne raccourcit jamais, cela suffit ...

 sys.stdout.write("\rDoing thing %i" % i)
sys.stdout.flush()
 

Un peu plus sophistiqué est une barre de progression ... c'est quelque chose que j'utilise:

 def startProgress(title):
    global progress_x
    sys.stdout.write(title + ": [" + "-"*40 + "]" + chr(8)*41)
    sys.stdout.flush()
    progress_x = 0

def progress(x):
    global progress_x
    x = int(x * 40 // 100)
    sys.stdout.write("#" * (x - progress_x))
    sys.stdout.flush()
    progress_x = x

def endProgress():
    sys.stdout.write("#" * (40 - progress_x) + "]\n")
    sys.stdout.flush()
 

Vous appelez startProgress passant la description de l'opération, puis progress(x)x est le pourcentage et enfin endProgress()

7voto

Bryce Siedschlaw Points 1365

L'autre réponse est peut-être meilleure, mais voici ce que je faisais. Tout d'abord, j'ai créé une fonction appelée progress qui imprime le caractère de retour arrière:

 def progress(x):
    out = '%s things done' % x  # The output
    bs = '\b' * 1000            # The backspace
    print bs,
    print out,
 

Ensuite, je l'ai appelé en boucle dans ma fonction principale comme ceci:

 def main():
    for x in range(20):
        progress(x)
    return
 

Bien sûr, cela effacera toute la ligne, mais vous pouvez jouer avec elle pour faire exactement ce que vous voulez. J'ai fini par faire une barre de progression en utilisant cette méthode.

7voto

jat255 Points 121

Pour ceux qui tombent sur des années plus tard (comme je l'ai fait), j'ai légèrement modifié les méthodes du 6502 pour permettre à la barre de progression de diminuer et d'augmenter. Utile dans un peu plus de cas. Merci 6502 pour un excellent outil!

Fondamentalement, la seule différence est que la ligne entière de # et -s est écrite à chaque appel de progress (x) et que le curseur revient toujours au début de la barre.

 def startprogress(title):
    """Creates a progress bar 40 chars long on the console
    and moves cursor back to beginning with BS character"""
    global progress_x
    sys.stdout.write(title + ": [" + "-" * 40 + "]" + chr(8) * 41)
    sys.stdout.flush()
    progress_x = 0


def progress(x):
    """Sets progress bar to a certain percentage x.
    Progress is given as whole percentage, i.e. 50% done
    is given by x = 50"""
    global progress_x
    x = int(x * 40 // 100)                      
    sys.stdout.write("#" * x + "-" * (40 - x) + "]" + chr(8) * 41)
    sys.stdout.flush()
    progress_x = x


def endprogress():
    """End of progress bar;
    Write full bar, then move to next line"""
    sys.stdout.write("#" * 40 + "]\n")
    sys.stdout.flush()
 

6voto

sorin Points 23747

Si j'ai bien compris (je ne sais pas) vous voulez imprimer en utilisant <CR> et non <LR> ?

Si tel est le cas, tant que le terminal de la console le permet (il se cassera lorsque la sortie sera redirigée vers un fichier).

 from __future__ import print_function
print("count x\r", file=sys.stdout, end=" ")
 

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