154 votes

Comment quitter pdb et permettre au programme de continuer ?

J'utilise le module pdb pour déboguer un programme. J'aimerais comprendre comment je peux quitter pdb et permettre au programme de continuer jusqu'à la fin. L'exécution du programme est coûteuse en termes de calcul, je ne veux donc pas quitter sans que le script ne tente de se terminer. continue ne semble pas fonctionner. Comment puis-je quitter pdb et continuer avec mon programme ?

256voto

voithos Points 15066

continue devrait "Continuer l'exécution, ne s'arrêter que lorsqu'un point d'arrêt est rencontré", donc vous avez un point d'arrêt défini quelque part. Pour supprimer le point d'arrêt (si vous l'avez inséré manuellement) :

(Pdb) break
Num Type         Disp Enb   Where
1   breakpoint   keep yes   at /path/to/test.py:5
(Pdb) clear 1
Deleted breakpoint 1
(Pdb) continue

Ou, si vous utilisez pdb.set_trace() vous pouvez essayer ceci (bien que si vous utilisez pdb de manière plus fantaisiste, cela peut casser des choses...)

(Pdb) pdb.set_trace = lambda: None  # This replaces the set_trace() function!
(Pdb) continue
# No more breaks!

42voto

Minh Triet Points 697

Un simple Ctrl - D va sortir de la pdb. Si vous voulez continuer plutôt que de vous arrêter, appuyez simplement sur c plutôt que l'ensemble continue commande

12voto

Adam Spiers Points 4193

El réponse de @voithos est correcte, je vais donc ajouter une alternative dans le cas où vous utilisez set_trace . Oui, le pdb.set_trace = lambda: None Le hack fonctionne bien, mais pas si vous avez d'autres points d'arrêt définis et que vous voulez le réactiver plus tard. Pour moi, cela indique que malheureusement pdb est dépourvu d'un grand nombre de fonctionnalités (même des éléments de base comme l'affichage de listes), et c'est un autre cas.

La bonne nouvelle est que pdb++ est une excellente solution de remplacement pour pdb et l'une des choses qu'il résout est précisément le problème de la désactivation set_trace . Vous pouvez donc simplement le faire :

pip install pdbpp

et ensuite au (Pdb++) tapez :

pdb.disable()

Si vous voulez le réactiver plus tard, sans surprise, cela fonctionne :

pdb.enable()

C'est facile ! Et vous obtiendrez en plus de cela de nombreux autres avantages utiles.

4voto

Steve Barnes Points 9505

Si vous souhaitez vraiment quitter le débogueur, vous devez exécuter quelque chose comme WinPdb qui vous permet de vous détacher du processus et de quitter le débogueur, (N.B. Il est multi-plateforme).

Si vous souhaitez poursuivre le débogage mais ne plus vous arrêter à un point d'arrêt donné, il vous faut

  1. Notez le numéro du point d'arrêt (ou le numéro du fichier et de la ligne),
  2. Soit cl bp_number o clear file:line pour supprimer définitivement le point d'arrêt o disable pb_number pour le désactiver, mais être capable de le réactiver.
  3. Puis continue et votre programme fonctionnera jusqu'à la prochaine différents point d'arrêt est atteint.

Pour plus de détails sur ce qui précède, voir le manuel .

3voto

Abc Xyz Points 570

Si vous avez utilisé breakpoint() dans votre code, vous pouvez désactiver tous ces points d'arrêt par une variable d'environnement.

import os
os.environ['PYTHONBREAKPOINT'] = '0'

Cela fonctionne également lorsque vous êtes dans l'état interactif (Pdb), cela désactivera toutes les fonctions de l'ordinateur. breakpoint() insérés dans votre code, mais pas les points d'arrêt activés par (Pdb).

Testons cela, le code est breakpoint() à la ligne 4 :

> /tmp/py.py(5)<module>()
-> print(x,a)
(Pdb) ll
  1     
  2     for x in "abcdefg":
  3         a=1
  4         breakpoint()
  5  ->     print(x,a)
  6         b=2
  7         print(x,b)

Fixons un nouveau point d'arrêt à la ligne 6.

(Pdb) break 6
Breakpoint 1 at /tmp/py.py:6

(Pdb) break
Num Type         Disp Enb   Where
1   breakpoint   keep yes   at /tmp/py.py:6

Maintenant, désactivons tous breakpoint() dans ce cas à la ligne 4.

(Pdb) import os
(Pdb) os.environ['PYTHONBREAKPOINT'] = '0'

et continuer

(Pdb) c
a 1
> /tmp/py.py(6)<module>()
-> b=2
(Pdb) ll
  1     
  2     for x in "abcdefg":
  3         a=1
  4         breakpoint()
  5         print(x,a)
  6 B->     b=2
  7         print(x,b)

maintenant il s'arrête à la ligne 6 et saute la ligne 4, continuons

(Pdb) c
a 2
b 1
> /tmp/py.py(6)<module>()
-> b=2

maintenant il s'arrête à nouveau à la ligne 6 et saute la ligne 4

(Pdb) break
Num Type         Disp Enb   Where
1   breakpoint   keep yes   at /tmp/py.py:6
(Pdb) clear 1
Deleted breakpoint 1 at /tmp/py.py:6

maintenant (Pdb) le point d'arrêt de la ligne 6 est supprimé et le programme peut continuer à fonctionner :

(Pdb) c
b 2
c 1
c 2
d 1
d 2
e 1
e 2
f 1
f 2
g 1
g 2

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