web-dev-qa-db-fra.com

Débogage interactif induit par un point d'arrêt de Python avec IPython

Disons que j'ai une session IPython, à partir de laquelle j'appelle un script:

> run my_script.py

Existe-t-il un moyen d'induire un point d'arrêt dans my_script.py À partir duquel je peux inspecter mon espace de travail depuis IPython?

Je me souviens avoir lu que dans les versions précédentes d'IPython, on pouvait faire:

from IPython.Debugger import Tracer;     

def my_function():
    x = 5
    Tracer()
    print 5;

mais le sous-module Debugger ne semble plus être disponible.

En supposant que j'ai déjà une session IPython ouverte: comment puis-je arrêter mon programme à un emplacement de mon choix et inspecter mon espace de travail avec IPython?

En général, je préférerais des solutions qui ne nécessitent pas que je prédéfinisse des numéros de ligne, car je souhaiterais éventuellement avoir plus d'un appel de ce type à Tracer() ci-dessus et ne pas avoir à suivre les numéros de ligne où ils sont.

33

La Tracer() existe toujours en ipython dans un module différent. Vous pouvez effectuer les opérations suivantes:

from IPython.core.debugger import Tracer

def my_function():
    x = 5
    Tracer()()
    print 5

Notez les parenthèses d'appel supplémentaires autour de Tracer

edit : Pour IPython 6 et suivants Tracerest déconseillé vous devez donc utiliser set_trace() au lieu:

from IPython.core.debugger import set_trace

def my_function():
    x = 5
    set_trace()
    print 5
29
pankaj

Vous pouvez l'exécuter et définir un point d'arrêt sur une ligne donnée avec:

run -d -b12 myscript

Où -b12 définit un point d'arrêt à la ligne 12. Lorsque vous entrez dans cette ligne, vous passez immédiatement dans pdb et vous devez entrer c pour exécuter jusqu'à ce point d'arrêt.

20
Wilduck

Il s'agit de la version utilisant la méthode set_trace() au lieu de la méthode Tracer() obsolète.

from IPython.core.debugger import Pdb

def my_function():
    x = 5
    Pdb().set_trace()
    print 5
12
Medhat Omr

Dans le shell IPython, vous pouvez faire

from IPython.core.debugger import Pdb
pdb = Pdb()
pdb.runcall(my_function)

par exemple, ou effectuez la pdb.set_trace() normale à l'intérieur de votre fonction.

6
Daniel Roseman

J'ai toujours eu la même question et la meilleure solution de contournement que j'ai trouvée qui est assez hackey est d'ajouter une ligne qui cassera mon code, comme ceci:

...
a = 1+2
STOP
...

Ensuite, lorsque j'exécuterai ce code, il se cassera, et je pourrai faire% debug pour y aller et inspecter. Vous pouvez également activer% pdb pour toujours aller au point où votre code casse, mais cela peut être gênant si vous ne voulez pas inspecter partout et à chaque fois que votre code casse. J'aimerais une solution plus élégante.

5
dvreed77