jeudi 4 août 2016

Python: faire un breakpoint en mode interactif pour faire du débogage

Dans les IDE évolués nous disposons généralement d'une fonctionnalité "Breakpoint" pour arrêter le programme et pouvoir inspecter le contenu des variables locales.
Il est possible de réaliser quelque-chose de similaire en mode console (python interactif) qui fonctionne aussi bien sous Windows que sous Linux. Très utile si l'on se trouve sur un environnement sans facilité.

Je bosse sur un projet TkInter et j'aurais trouvé intéressant de pouvoir inspecter le contenu d'un événement en mode interactif... bref, sauter dans un débogueur mais "sans débogueur" à disposition.

J'ai trouvé ce petit bout de code qui fonctionne à merveille et qui lance un python interactif là où j'en ai besoin.
La réponse se trouve dans code.interact()
 
>>> import code
>>> def foo():
...   a = 10
...   code.interact(local=locals())
...   return a
...
>>> foo()
Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> a
10

  • Presser Ctrl+Z pour terminer la session interactive. 
  • Il n'est pas possible de modifier les variables locales (cela n'a pas d'implication sur le code appelant). 
  • Vous pouvez lister inspecter les variables locales en utilisant dir() 
Voici un autre exemple tel qu'utilisé depuis un code tkInter.
N'oubliez pas de démarrez votre programme avec python.exe et non pythonw.exe pour disposer d'une console ;-)

import code
...
...
def focus_next_window(event):
    """ Move focus to next item, Bind it for  """
    print( type(event.widget) )
    code.interact(local=locals())
    event.widget.tk_focusNext().focus()
    return("break")

Souce: http://stackoverflow.com/questions/13432717/enter-interactive-mode-in-python

Aucun commentaire: