2010-01-28 5 views
65

j'ai un module python avec une fonction:tomber dans l'interpréteur python en exécution de la fonction

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

est-il un moyen de tomber dans l'interpréteur de ligne de commande où je le commentaire? de sorte que si je lance ce qui suit en python:

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

-je obtenir mon invite suivante dans le champ d'application et le contexte où j'ai le commentaire dans do_stuff()?

+0

double possible de [Entrer dans le mode interactif En Python] (http://stackoverflow.com/questions/13432717/enter-interactive-mode-in-python) –

Répondre

42

Insertion

import pdb; pdb.set_trace() 

entrera dans le débogueur de python à ce moment

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

+0

'pdb' est grande python à la vanille; si vous avez de la place pour apporter un paquet externe, 'ipdb' est super - même fonctionnalité que le débogueur, mais avec la syntaxe en surbrillance, complétion de tabulation, etc ipython – khstacking

115

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

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

Voir: le code module.

Si vous avez IPython installé, et que vous voulez une place shell IPython, 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 ... donc commencez en utilisant "import IPython; IPython.embed()" à la place. – evandrix

+0

Est-il possible de continuer après avoir entré 'code.interact()', un PDB 'c (ontinue)'? –

+3

'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 suivante. –

14

Si vous voulez un interprète Python par défaut, vous pouvez le faire

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

Cela permettra l'accès à la fois locales et globales.

Si vous souhaitez basculer dans un interpréteur IPython, la solution IPShellEmbed est obsolète. À l'heure actuelle ce qui fonctionne est:

from IPython import embed 
embed() 
+4

merci,' code.interact (local = dict (globals(), ** local())) 'est donc beaucoup mieux que le code.interact (local = locals()) 'parce que ce dernier vous oblige à ré-importer des paquets – s2t2

+0

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

Questions connexes