2016-09-30 1 views
2

Lors du débogage des scripts en Python (2.7, fonctionnant sous Linux) j'injecte de temps en temps pdb.set_trace() (note que je suis en fait en utilisant ipdb), par exemple:comment arrêter le programme python après pdb.set_trace()

En général, j'exécute mon script à partir de la coque, par exemple:
import ipdb as pdb 
try: 
    do_something() 
    # I'd like to look at some local variables before running do_something_dangerous() 
    pdb.set_trace() 
except: 
    pass 
do_something_dangerous() 

python my_script.py 

Parfois, au cours de ma session de débogage je me rends compte que je ne veux pas courir do_something_dangerous(). Quel est le moyen le plus simple d'arrêter l'exécution du programme pour que do_something_dangerous() ne soit pas exécuté et que je puisse revenir au shell? Si je comprends bien, appuyer sur ctrl-d (ou lancer la commande quit du débogueur) quittera simplement ipdb et le programme continuera à fonctionner (dans mon exemple ci-dessus). En appuyant sur ctrl-c semble déclencher un KeyboardInterrupt mais je n'ai jamais compris le contexte dans lequel il a été soulevé. J'espere quelque chose comme ctrl-q pour simplement enlever tout le processus, mais je n'ai pas pu trouver quoi que ce soit. Je comprends que mon exemple est très artificiel, mais ma question est sur la façon d'abandonner l'exécution de pdb lorsque le code en cours de débogage est configuré pour attraper les exceptions. Il ne s'agit pas de restructurer le code ci-dessus pour que cela fonctionne!

Répondre

0

De l'module docs:

q (uit) quittiez le débogueur. Le programme en cours d'exécution est annulé.

Plus précisément, cela provoquera la prochaine fonction de débogage qui est appelé à soulever une exception BdbQuit.

+0

Je pense que ctrl-d et q (uit) sont les mêmes, et mon code est configuré pour attraper des exceptions, donc cela ne termine pas avec succès mon programme. Je vais mettre à jour mon exemple en conséquence car ce n'était pas clair du tout! – nonagon

1

J'ai trouvé que ctrl-z pour suspendre le processus python/ipdb, suivi de 'kill% 1' pour terminer le processus fonctionne bien et est raisonnablement rapide pour moi de taper (avec un alias k = 'kill% 1 '). Je ne suis pas sûr s'il y a quelque chose de plus propre/simple cependant.

+0

en fait alias k = 'kill %%; wait %% 2>/dev/null 'était un peu meilleur pour mes besoins (il supprime les messages [1] + et fonctionne s'il y a d'autres jobs) – nonagon