web-dev-qa-db-fra.com

python barre de progression utilisant tqdm ne restant pas sur une seule ligne

J'essaie d'exécuter un script qui tente d'installer des modules sur un système centos7 via la gestion des marionnettes. Je veux implémenter une barre de progression pour l'installation qui se produit lors de l'exécution du script. J'utilise le module tqdm pour ce faire. c'est un aperçu de la façon dont j'ai mis en œuvre le module:

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

Ici run_apply () est la fonction qui gère réellement l'exécution et l'application de la configuration de marionnette.

Jusqu'ici tout va bien, j'obtiens une barre de progression mais elle continue de descendre dans la console au fur et à mesure que les messages d'exécution sont écrits sur la console. Mais, j'ai besoin que la barre de progression reste constante au bas de la console et soit mise à jour dynamiquement sans que les messages d'exécution n'interfèrent avec la barre. Je veux que les messages liés à l'exécution sur la console continuent comme ils le souhaitent, mais la barre de progression devrait simplement rester là en bas du début à la fin de l'exécution.

Voici ce que je vois:

        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]
...  

Veuillez me faire savoir comment je peux réaliser ce que je veux.

15
cool77

Pour que les messages soient imprimés au-dessus de la barre de progression, vous devez signaler à tqdm que vous imprimez des messages (sinon tqdm, ni aucune autre barre de progression, ne peut pas savoir que vous sortez des messages à côté de la barre de progression).

Pour ce faire, vous pouvez imprimer vos messages en utilisant tqdm.write(msg) au lieu de print(msg). Si vous ne voulez pas modifier run_apply() pour utiliser tqdm.write(msg) au lieu de print(msg), vous pouvez rediriger toutes les sorties standard via tqdm à partir du script toplevel comme décrit ici .

20
gaborous