J'aime inspecter les erreurs dans un script Python en utilisant:
$ python3 -m pdb my_script.py
Cela me place dans une invite pdb à partir de laquelle je peux c
continuer l'exécution, et quand il rencontre une erreur, je peux inspecter les variables puis q
quitter l'exécution du script pour revenir à mon shell .
J'ai essayé la même chose avec le module de débogage iPython, car il est plus coloré:
$ python3 -m ipdb my_script.py
Cependant, je ne peux pas quitter le débogueur une fois que j'ai fini d'inspecter l'erreur. L'utilisation de la commande q
quit ne fait que basculer entre la réexécution du script et le mode post mortem:
$ python3 -m ipdb my_script.py
ipdb> c
Uncaught exception. Entering post mortem debugging
Running 'cont' or 'step' will restart the program
ipdb> Inspect some variables at this point
ipdb> q
Post mortem debugger finished. The my_script.py will be restarted
ipdb> q
Uncaught exception. Entering post mortem debugging
Running 'cont' or 'step' will restart the program
ipdb> q
Post mortem debugger finished. The my_script.py will be restarted
ipdb> q
Uncaught exception. Entering post mortem debugging
Running 'cont' or 'step' will restart the program
ipdb> q
Post mortem debugger finished. The my_script.py will be restarted
ipdb> q
Uncaught exception. Entering post mortem debugging
Running 'cont' or 'step' will restart the program
Comment quitter ce débogueur?
C'était un bogue dans IPython 5.1. Il a été corrigé dans cette demande de tirage et n'est plus un problème à partir d'IPython 5.2 et versions ultérieures. Vous pouvez maintenant utiliser q
, quit()
ou Ctrl+d pour quitter le débogueur.
Comme l'a commenté l'utilisateur @ffeast, il y a n problème ouvert d'ipdb , et quelques solutions de contournement suggérées. Pour moi, cela a bien fonctionné:
kill %1
(ou quel que soit le numéro de tâche)ipdb> import os; os._exit(1)
Utilisation ctrl+z ou ouvrez un deuxième terminal, puis recherchez le processus (ps -ax | grep python
) et tue le processus .
Pas à pas:
Accédez à un terminal:
ssh server
(utilisez l'option B ou C pour pouvoir ouvrir une deuxième connexion pour exécuter la commande)Recherchez le python PID
correspondant du processus ps -ax | grep python
. Par exemple, l'ID de processus pour mon processus (python my_stucked_process.py
) serait 112923
:
3085 tty1 Sl+ 15:53 /usr/bin/python /usr/bin/x-terminal-emulator
112923 pts/2 Tl 0:01 python my_stucked_process.py
113118 pts/2 S+ 0:00 grep --color=auto python
kill -9 112923
@tutuDajuju a suggéré d'utiliser ctrl+z mais leur suggestion n'enverra le processus qu'en arrière-plan (il existera toujours en consommant de la mémoire). Vous devez faire ce qui précède pour vraiment tuer le processus