2016-08-04 33 views
6

Ich versuche, ein Skript auszuführen, das versucht, Module auf einem Centos7-System über Puppet-Management zu installieren. Ich möchte eine Fortschrittsleiste für die Installation implementieren, die beim Ausführen des Skripts passiert. Ich verwende tqdm-Modul, um dies zu tun. dies ist ein Kinderspiel, wie ich das Modul implementiert haben:Python Fortschrittsbalken mit tqdm nicht in einer einzigen Zeile bleiben

from tqdm import tqdm 
for i in tqdm(commands): 
    res = run_apply(i) 

Hier run_apply() ist die Funktion, die tatsächlich behandelt laufen und die Puppe Konfiguration anwenden.

Soweit so gut, ich bekomme einen Fortschrittsbalken, aber es bewegt sich weiter die Konsole als und wenn Ausführungsmeldungen auf der Konsole geschrieben werden. Aber ich brauche den Fortschrittsbalken, um am unteren Rand der Konsole konstant zu bleiben und dynamisch aktualisiert zu werden, ohne dass die Laufnachrichten die Leiste stören. Ich möchte, dass die auf die Ausführung bezogenen Meldungen auf der Konsole so weitergehen, wie sie wollen, aber die Fortschrittsanzeige sollte einfach unten bleiben, vom Start bis zum Ende der Ausführung.

Im Folgenden finden Sie, was ich zu sehen bin:

 File line: 0.00 
      Package: 0.05 
      Service: 0.19 
      File: 0.23 
      Exec: 0.23 
     Last run: 1470308227 
    Config retrieval: 3.90 
      Total: 4.60 
Version: 
      Config: 1470308220 
      Puppet: 3.7.3 
now here x 
result: 2 
38%|█████████████████████████████████████▋               | 5/13 [00:29<00:51, 6.44s/it]about to: profiles::install::download_packages 
about to run puppet apply --summarize --detailed-exitcodes --certname puppet -e "include profiles::install::download_packages" 
Error: Could not find class profiles::install::download_packages for puppet on node puppet 
Error: Could not find class profiles::install::download_packages for puppet on node puppet 
now here x 
result: 1 
46%|█████████████████████████████████████████████▏             | 6/13 [00:32<00:36, 5.27s/it]about to: profiles::install::install 
about to run puppet apply --summarize --detailed-exitcodes --certname puppet -e "include profiles::install::install" 
Error: Could not find class profiles::install::install for puppet on node puppet 
Error: Could not find class profiles::install::install for puppet on node puppet 
now here x 
result: 1 
54%|████████████████████████████████████████████████████▊            | 7/13 [00:34<00:26, 4.45s/it]about to: stx_network 
about to run puppet apply --summarize --detailed-exitcodes --certname puppet -e "include stx_network" 
Notice: Compiled catalog for puppet in environment production in 0.84 seconds 
Notice: /Stage[main]/Stx_network/Tidy[purge unused nics]: Tidying File[/etc/sysconfig/network-scripts/ifcfg-lo] 
... 

Bitte lassen Sie mich wissen, wie ich erreichen kann, was ich will.

Antwort

8

Damit die Nachrichten über dem Fortschrittsbalken gedruckt werden, müssen Sie tqdm signalisieren, dass Sie Nachrichten drucken (sonst kann tqdm oder ein anderer Fortschrittsbalken nicht wissen, dass Sie Nachrichten neben dem Fortschrittsbalken ausgeben).

Um dies zu tun, können Sie Ihre Nachrichten mit tqdm.write(msg) anstelle von print(msg) drucken. Wenn Sie run_apply() nicht ändern möchten, um tqdm.write(msg) anstelle von print(msg) zu verwenden, können Sie redirect all standard output through tqdm from the toplevel script as described here.

-1

Versuchen Sie es mit: Progressbar

import Progressbar 
progress = progressbar.ProgressBar() 
for i in progress(range(30)): 
    time.sleep(0.1) 

Es wird wie folgt aussehen: 43% (13 von 30) | ################### ######### | Verstrichene Zeit: 0:00:01 ETA: 0:00:01

+0

Hier ist der Link dafür: https://pypi.python.org/pypi?%3Aaction=search&term=Progressbar&submit=search –

+0

Dieser unglückliche gewonnen ' t lösen Sie das Problem, da die Nachrichten über den Fortschrittsbalken gedruckt werden und somit die Ausgabe wie in OP verstümmelt wird. – gaborous

+0

Wie .... Sagen Sie mir .... –