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()?


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


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())

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()

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.