2009-05-29 11 views
11

Hej zastanawiałem się ... Używam PyDev z Eclipse i jestem naprawdę korzystających z zaawansowanych funkcji debugowania, ale zastanawiałem się:Skocz do mid-programu Python Interactive Session?

Czy to możliwe, aby ustawić punkt przerwania w Eclipse i wskoczyć do Interaktywny interpreter python podczas wykonywania?

myślę, że byłoby całkiem poręczny;)

edit: Chcę podkreślić, że moim celem nie jest wskoczyć do debuggera. pydev/eclipse ma świetny debugger i mogę po prostu spojrzeć na traceback i ustawić punkty przerwania.

Co chcę to wykonać skrypt i wskoczyć interaktywny interpreter Pythona w trakcie realizacji, więc mogę robić takie rzeczy jak ...

  • rozglądamy
  • sprawdzić wartości rzeczy
  • manipulować zmienne
  • dowiedzieć się jakiś kod, zanim go dodać do aplikacji

wiem, że można to zrobić cały dowcip h debuggera, ale mogę to zrobić szybciej w interaktywnym tłumaczu, ponieważ mogę spróbować czegoś, zobaczyć, że to nie działa, i spróbować czegoś innego, bez konieczności powrotu aplikacji do punktu ponownego wykonywania tego kodu.

+0

Nie trzeba naciskać - rozważ zmianę formatowania? –

Odpowiedz

8

Tak mniej więcej rok po Kwestia OP, PyDev ma wbudowaną tę funkcję. Nie jestem pewien, kiedy wprowadzono tę funkcję, ale wiem tylko, że spędziłem ostatnie ~ 2 godziny na pracy Google ... konfigurując iPython i cokolwiek (co wyglądało tak, jakby to zrobiło praca), ale tylko po to, aby zdać sobie sprawę, że Eclipse/PyDev ma to, co chcę ootb.

Natychmiast po naciśnięciu punktu przerwania w trybie debugowania konsola jest gotowa i czeka! Tylko nie zauważyłem tego, ponieważ nie ma podpowiedzi ani migającego kursora; Błędnie założyłem, że jest to standardowa, wyjściowa konsola ... ale tak nie jest. Ma nawet kodowanie.

Świetne rzeczy, zobacz http://pydev.org/manual_adv_debug_console.html, aby uzyskać więcej informacji.

+0

wow ... wielkie znalezisko :) – Jiaaro

+0

Tak, można nawet użyć go na stosie Apache + mod_wsgi (lub innej konfiguracji produkcyjnej). Jednak aby zapewnić działanie interaktywnej konsoli, musisz ją uruchomić jako taką: 'from pydevsrc import pydevd; pydevd.settrace ('', stdoutToServer = True, stderrToServer = True)' –

-2

Jeśli już uruchomiony w trybie debugowania można ustawić dodatkowe przerwania, jeśli wykonanie programu jest obecnie wstrzymana (np dlatego, że jesteś już na przerwania). Właśnie wypróbowałem to teraz z najnowszym Pydev - działa dobrze.

Jeśli działa normalnie (czyli nie w trybie debugowania) wszystkie wartości graniczne zostaną zignorowane. Żadne zmiany w punktach przerwania nie zmieniają sposobu działania debugowania bez debugowania.

2

ja od dawna za pomocą tego kodu w moim sitecustomize.py uruchomić debugger na wyjątek. Może to być również wywołane przez Ctrl + C. Działa pięknie w powłoce, nie wiem o zaćmieniu.

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 

Oto source i more discussion on StackOverflow.

2

Można wskoczyć sesji interaktywnej z wykorzystaniem code.InteractiveConsole jak opisano here; jednak nie wiem, jak uruchomić to z Eclipse.

Rozwiązaniem może być przechwycenie Ctrl + C, aby przejść do tej interaktywnej konsoli (przy użyciu modułu signal: signal.signal(signal.SIGINT, my_handler)), ale prawdopodobnie zmieniłoby to kontekst wykonania i prawdopodobnie tego nie chcemy.

1

Niezbyt trafna odpowiedź na twoje pytanie, ale tylko wskazówka na iPython. Na wszelki wypadek, jeśli nie jesteś tego świadomy. Używam tego side-by-side z eclipse/pydev dla takich właśnie rzeczy.

Of relevence jest ta informacja na osadzanie iPython do własnej aplikacji. Daje to możliwość robienia tego, czego szukasz, jeśli chcesz to zrobić poza zaćmieniem/pydevem.

6

To jest ze starego projektu, a ja go nie napisałem, ale robi coś podobnego do tego, czego chcesz, używając 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) 

edit Jim Robert (właściciel) pytanie: Jeśli umieścić powyższy kod w pliku o nazwie my_debug.py przez wzgląd na tym przykładzie. Następnie umieścić ten plik w ścieżce Pythona, a można wstawić następujące linie w dowolnym miejscu w kodzie, aby przejść do debuggera (tak długo, jak wykonać z powłoki):

import my_debug 
my_debug.db()