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 ?
Réponses
Trop de publicités?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!
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.
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
- Notez le numéro du point d'arrêt (ou le numéro du fichier et de la ligne),
- Soit
cl bp_number
oclear file:line
pour supprimer définitivement le point d'arrêt odisable pb_number
pour le désactiver, mais être capable de le réactiver. - 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 .
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
- Réponses précédentes
- Plus de réponses