tomber dans l'interpréteur python lors de l'exécution de la fonction

90

j'ai un module python avec une fonction:

def do_stuff(param1 = 'a'):
    if type(param1) == int:
        # enter python interpreter here
        do_something()
    else:
        do_something_else()

y a-t-il un moyen de passer dans l'interpréteur de ligne de commande où j'ai le commentaire? de sorte que si j'exécute ce qui suit en python:

>>> import my_module
>>> do_stuff(1)

j'obtiens ma prochaine invite dans la portée et le contexte de l'endroit où j'ai le commentaire do_stuff()?

aaronstatie
la source
Reproduction possible de Enter Interactive Mode In Python
Mad Physicist

Réponses:

60

Insertion

import pdb; pdb.set_trace()

entrera dans le débogueur python à ce stade

Voir ici: http://docs.python.org/library/pdb.html

prestomation
la source
pdbest un grand python vanille; si vous avez de la place pour apporter un package externe, ipdbc'est génial - même fonctionnalité que le débogueur, mais avec la coloration syntaxique, la complétion des tabulations, etc. d'ipython
khstacking
Mise à jour - ipdbétait obsolète, de nos jours j'utilise pdbpp( pdb++) , qui a des fonctionnalités similaires, et fonctionne avec import pdb; pdb.set_trace()(c'est-à-dire qu'il corrige qui importent, donc c'est un remplacement
instantané
@hangtwenty: pourquoi dites-vous que ipdbc'était obsolète? Je ne trouve aucune nouvelle à ce sujet.
Nick Matteo
@Kundor hein, tu as raison. Je me souviens distinctement avoir lu quelque part que les auteurs avaient décidé d'arrêter de maintenir le projet et pointaient du doigt un autre projet à utiliser à la place. Peut-être que c'est arrivé pendant un moment, puis il a été ressuscité? Je peux me tromper! Dans les deux cas, j'ai apprécié ipdbavant, mais j'ai apprécié pdbppdepuis
driftcatcher
141

Si vous voulez une invite interactive standard (au lieu du débogueur, comme indiqué par prestomation), vous pouvez le faire:

import code
code.interact(local=locals())

Voir: le module de code .

Si vous avez installé IPython et que vous voulez un shell IPython à la place, vous pouvez le faire pour IPython> = 0.11:

import IPython; IPython.embed()

ou pour les anciennes versions:

from IPython.Shell import IPShellEmbed
ipshell = IPShellEmbed()
ipshell(local_ns=locals())
Matt Anderson
la source
27
pour IPython> = 0.11, il n'y a plus de module Shell dans IPython ... alors démarrez-le en utilisant "import IPython; IPython.embed ()" à la place.
evandrix le
Est-il possible de continuer après être entré code.interact(), à la PDB c(ontinue)?
Nick T
4
code.interact()est un appel bloquant. Votre programme s'arrêtera et attendra qu'il se termine. Si vous quittez l'interpréteur interactif, votre programme devrait reprendre avec l'instruction immédiatement suivante.
Matt Anderson
1
Quelle est la différence entre une invite interactive et un débogueur?
StockB
1
@StockB C'est l' invite interactive standard qui le rend important. Le débogueur est une invite interactive, mais ce n'est pas la même chose. Dans PDB, vous ne pouvez pas faire d'instructions multilignes, la helpfonction intégrée est remplacée, etc.
kbrose
28

Si vous voulez un interpréteur Python par défaut, vous pouvez faire

import code
code.interact(local=dict(globals(), **locals()))

Cela permettra d'accéder à la fois aux locaux et aux globaux.

Si vous souhaitez accéder à un interpréteur IPython, la IPShellEmbedsolution est obsolète . Actuellement, ce qui fonctionne est:

from IPython import embed
embed()
Ronan Paixão
la source
8
merci, code.interact(local=dict(globals(), **locals()))c'est tellement mieux que code.interact(local=locals())parce que ce dernier vous oblige à réimporter des paquets
s2t2
Cette réponse a mieux fonctionné pour moi puisque j'utilisais un script bash pour appeler mon code python. Je ne pouvais pas interagir avec mon code python en utilisant la réponse acceptée. Merci!
jonathanking