2009-05-29 4 views
11

Hé, je me demandais ... J'utilise le pydev avec Eclipse et je suis vraiment profiter des puissantes fonctionnalités de débogage, mais je me demandais:Sautez dans un mid-programme Python Interactive Session?

Est-il possible de définir un point d'arrêt dans Eclipse et sauter dans la Interprète python interactif pendant l'exécution?

Je pense que ce serait très pratique;)

modifier: Je tiens à souligner que mon but est de ne pas sauter dans un débogueur. pydev/eclipse a un excellent débogueur, et je peux juste regarder la traceback et définir les points de rupture.

Ce que je veux est d'exécuter un script et sauter dans un interpréteur Python interactif en cours d'exécution afin que je puisse faire des choses comme ...

  • fouiner
  • vérifier les valeurs des choses
  • manipuler les variables
  • figure sur un code avant de l'ajouter à l'application

Je sais que vous pouvez faire tout esprit h un débogueur, mais je peux le faire plus rapidement dans l'interpréteur interactif parce que je peux essayer quelque chose, voir que cela n'a pas fonctionné, et essayer quelque chose d'autre sans que l'application soit à nouveau en train d'exécuter ce code.

+0

Pas besoin de mettre l'accent - pensez à reformater? –

Répondre

8

donc à peu près un an après la PyDev a cette capacité intégrée. Je ne suis pas sûr quand cette fonctionnalité a été introduite, mais tout ce que je sais, c'est que j'ai passé les dernières 2 heures Googling ... configurer iPython et quoi que ce soit (qui ressemblait à ça aurait fait le travail), mais seulement pour réaliser Eclipse/PyDev a ce que je veux ootb.

Dès que vous atteignez un point d'arrêt en mode débogage, la console est prête et prête! Je ne l'ai pas remarqué car il n'y a pas de prompteur ou de curseur clignotant; J'avais à tort supposé que c'était une console standard, en sortie seulement, mais ce n'est pas le cas. Il a même un code d'achèvement.

Très bien, voir http://pydev.org/manual_adv_debug_console.html pour plus de détails.

+0

wow ... super trouvaille :) – Jiaaro

+0

Oui et vous pouvez même l'utiliser sur une pile Apache + mod_wsgi (ou autre configuration de production). Cependant, pour que la console interactive fonctionne, vous devez la lancer comme suit: 'pydevsrc import pydevd; pydevd.settrace ('', stdoutToServer = True, stderrToServer = True)' –

-2

Si vous exécutez déjà en mode débogage, vous pouvez définir un point d'arrêt supplémentaire si l'exécution du programme est actuellement en pause (par exemple, parce que vous êtes déjà à un point d'arrêt). Je viens juste de l'essayer avec le dernier Pydev - ça marche très bien.

Si vous exécutez normalement (c'est-à-dire pas en mode débogage), tous les points d'arrêt seront ignorés. Aucun changement aux points d'arrêt ne modifiera le fonctionnement d'une exécution non-debug.

2

J'ai longtemps utilisé ce code dans mon sitecustomize.py pour démarrer un débogueur sur une exception. Cela peut également être déclenché par Ctrl + C. Il fonctionne magnifiquement dans la coquille, ne sait pas à propos de l'éclipse.

import sys 

def info(exception_type, value, tb): 
    if hasattr(sys, 'ps1') or not sys.stderr.isatty() or not sys.stdin.isatty() or not sys.stdout.isatty() or type==SyntaxError: 
     # we are in interactive mode or we don't have a tty-like 
     # device, so we call the default hook 
     sys.__excepthook__(exception_type, value, tb) 
    else: 
     import traceback 
     import pdb 


     if exception_type != KeyboardInterrupt: 
      try: 
       import growlnotify 
       growlnotify.growlNotify("Script crashed", sticky = False) 
      except ImportError: 
       pass 

     # we are NOT in interactive mode, print the exception... 
     traceback.print_exception(exception_type, value, tb) 
     print 
     # ...then start the debugger in post-mortem mode. 
     pdb.pm() 

sys.excepthook = info 

Voici le source et more discussion on StackOverflow.

2

Vous pouvez passer à une session interactive en utilisant code.InteractiveConsole comme décrit here; Cependant, je ne sais pas comment déclencher cela à partir d'Eclipse. Une solution pourrait être d'intercepter Ctrl + C pour sauter dans cette console interactive (en utilisant le module signal: signal.signal(signal.SIGINT, my_handler)), mais cela changerait probablement le contexte d'exécution et vous ne le voudriez probablement pas.

1

Pas vraiment une réponse à votre question, mais juste un pointeur vers iPython. Juste au cas où vous n'êtes pas au courant. Je l'utilise côte à côte avec eclipse/pydev pour de telles choses.

De la pertinence est cette information sur l'intégration iPython dans votre propre application. Ceci fournit la capacité de faire ce que vous recherchez si vous êtes prêt à le faire en dehors d'éclipse/pydev.

6

Cela vient d'un ancien projet, et je ne l'ai pas écrit, mais il fait quelque chose de similaire à ce que vous voulez en utilisant ipython.

'''Start an IPython shell (for debugging) with current environment.      
Runs Call db() to start a shell, e.g.             


def foo(bar):                   
    for x in bar:                  
     if baz(x):                  
      import ipydb; ipydb.db() # <-- start IPython here, with current value of x (ipydb is the name of this module). 
.                      
''' 
import inspect,IPython 

def db(): 
    '''Start IPython shell with callers environment.''' 
    # find callers                  
    __up_frame = inspect.currentframe().f_back 
    eval('IPython.Shell.IPShellEmbed([])()', # Empty list arg is      
     # ipythons argv later args to dict take precedence, so       
     # f_globals() shadows globals(). Need globals() for IPython     
     # module.                  
     dict(globals().items() + __up_frame.f_globals.items()), 
     __up_frame.f_locals) 

modifier par Jim Robert (propriétaire de question): Si vous placez le code ci-dessus dans un fichier appelé my_debug.py à cause de cet exemple. Ensuite, placez ce fichier dans votre chemin de python, et vous pouvez insérer les lignes suivantes ne importe où dans votre code pour sauter dans un débogueur (tant que vous exécutez à partir d'un shell):

import my_debug 
my_debug.db() 
Questions connexes