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.
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 Tracer
est 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
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.
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
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.
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.