Debug Python ipdb

Un débugueur (ou débogueur ou debugger) est un soft qui vous aide à résoudre des problèmes que l'on ne comprend pas sur vos scripts.

Il permet notamment d'exécuter un programme pas par pas, c'est à dire d'étudier l'exécution du code en temps réel et y voir en direct la valeur des variables à un endroit précis.

Vous pouvez déboguer votre script comme bon vous semble ; souvent un print suffit mais dans des cas plus complexes vous pouvez utiliser des logiciels plus poussés comme ipdb qui est une combinaison de ipython et de pdb

Installer ipdb

Passons par pip:

pip install ipdb

Implémenter ipdb dans votre programme

Il vous suffit de rajouter la ligne suivante à l'endroit où vous voulez deboguer votre code:

import ipdb; ipdb.set_trace()

Exemple

Ajoutons set_trace dans notre code comme ceci:

class LoginView(TemplateView):

	template_name = 'front/index.html'

	def post(self, request, **kwargs):

		import ipdb; ipdb.set_trace()

		username = request.POST.get('username', False)
		password = request.POST.get('password', False)
				
		return render(request, self.template_name)

Puis exécutons notre code (dans notre cas il s'agit d'un script Django)

Nous voyons que le script s'est arrêté et ceci s'affiche dans notre console:

> /home/olivier/mon_projet/front/views.py(31)post()
     30 
---> 31                 username = request.POST.get('username', False)
     32                 password = request.POST.get('password', False)

Elargir le contexte

Nous pouvons agrandir la vue pour mieux cerner le contexte en passant pour l'option l:

ipdb> l

Résulat:

     26 
     27                 # logout(request)
     28 
     29                 import ipdb; ipdb.set_trace()
     30 
---> 31                 username = request.POST.get('username', False)
     32                 password = request.POST.get('password', False)
     33 
     34                 user = authenticate(username=username, password=password)
     35                 if user is not None:
     36                         if user.is_active:

L'affichage a été augmenté de 4 lignes du haut et du bas.

Voir la valeur d'une variable

Toujours dans la console vous pouvez taper le nom de la variable qui vous intéresse pour l'étudier:

ipdb> request.POST
<QueryDict: {u'username': [u'olivier'], u'csrfmiddlewaretoken': [u'xxx'], u'password': [u'xxx']}>

Passer à la ligne suivante

Pour passer à la ligne suivante, utilisez la commande n (pour next) :

ipdb> n
> /home/olivier/perso/mon_projet/front/views.py(32)post()
     31                 username = request.POST.get('username', False)
---> 32                 password = request.POST.get('password', False)
     33 

Les options

l  ---> élargir le contexte
n  ---> passer à la ligne suivante
q  ---> quitter sauvagement
c  ---> continuer l'exécution du programme jusqu'à sa fin
s  ---> rentre dans la fonction de la ligne en cours
r  ---> execute un return