Wskoczyć do interaktywnej sesji Pythona w połowie programu?

Hej, zastanawiałem się... Używam pydev z eclipse i naprawdę cieszę się z potężnych funkcji debugowania, ale zastanawiałem się:

Czy Można ustawić breakpoint w eclipse i wskoczyć do interaktywnego interpretera Pythona podczas wykonywania?

Myślę, że byłoby to całkiem przydatne;)

Edit: chcę podkreślić, że moim celem nie jest skakanie do debuggera. pydev / eclipse mają świetny debugger I mogę po prostu spojrzeć na traceback i Ustaw break points.

Chcę wykonać skrypt i wskoczyć do interaktywnego interpretera Pythona podczas wykonywania, aby móc robić takie rzeczy jak...

  • poke around
  • sprawdź wartości rzeczy
  • manipulowanie zmiennymi
  • wymyśl jakiś kod zanim dodam go do aplikacji

Wiem, że możesz to wszystko zrobić za pomocą debuggera, ale ja mogę to zrobić szybciej w interaktywnym interpreterze, ponieważ mogę spróbować czegoś, zobaczyć, że nie działa i spróbować coś innego bez konieczności uzyskania aplikacji z powrotem do punktu wykonywania tego kodu ponownie.

Author: Jiaaro, 2009-05-29

6 answers

Więc mniej więcej rok po pytaniu OP, PyDev ma tę zdolność wbudowaną. Nie jestem pewien, kiedy ta funkcja została wprowadzona, ale wiem tylko, że spędziłem ostatnie ~2 godziny na Googlowaniu... konfigurowanie ipythona i cokolwiek (co wyglądało, jakby to wykonało robotę), ale tylko po to, aby zdać sobie sprawę, że Eclipse / PyDev ma to, czego chcę ootb.

Jak tylko trafisz punkt przerwania w trybie debugowania, konsola jest gotowa i czeka! Nie zauważyłem tego tylko dlatego, że nie ma znaku zachęty ani mrugnięcia kursor; błędnie założyłem, że jest to standardowa, tylko wyjściowa konsola... ale tak nie jest. Ma nawet Ukończenie kodu.

Świetne rzeczy, zobacz http://pydev.org/manual_adv_debug_console.html Po Więcej Szczegółów.

 9
Author: Darren Bishop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-06 10:28:37

To jest ze starego projektu, a ja go nie napisałem, ale robi coś podobnego do tego, co chcesz za pomocą ipythona.

'''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 by Jim Robert (question owner) : Jeśli umieścisz powyższy kod w pliku o nazwie my_debug.py dla tego przykładu. Następnie umieść ten plik w ścieżce Pythona i możesz wstawić następujące wiersze w dowolnym miejscu kodu, aby przejść do debuggera (o ile wykonujesz go z powłoki):

import my_debug
my_debug.db()
 6
Author: rz.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-08 15:27:49

Od dawna używam tego kodu w moim sitecustomize.py, aby uruchomić debugger na wyjątku. Może to być również wywołane przez Ctrl + C. działa pięknie w powłoce, Nie wiem o eclipse.

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 źródło i więcej dyskusji na temat StackOverflow .

 2
Author: Michael Kuhn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:19:34

Możesz wskoczyć do interaktywnej sesji używając code.InteractiveConsolezgodnie z opisem tutaj; jednak nie wiem jak to uruchomić z Eclipse.

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

 2
Author: Schnouki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-05 15:20:58

Nie jest to prawdziwa odpowiedź na twoje pytanie, ale tylko wskaźnik do ipythona. Na wypadek, gdybyś nie była tego świadoma. Używam go obok eclipse/pydev do takich właśnie rzeczy.

Istotne jest to, że informacje o osadzeniu iPython we własnej aplikacji. Daje to możliwość zrobienia tego, czego szukasz, jeśli chcesz to zrobić poza eclipse/pydev.

 1
Author: tinjaw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-06 18:19:42

Jeśli jesteś już uruchomiony w trybie debugowania, możesz ustawić dodatkowy punkt przerwania, jeśli wykonanie programu jest aktualnie wstrzymane (np. ponieważ jesteś już w punkcie przerwania). Właśnie wypróbowałem go teraz z najnowszym Pydev - działa dobrze.

Jeśli pracujesz normalnie (tzn. nie w trybie debugowania) wszystkie punkty przerwania zostaną zignorowane. Żadne zmiany w punktach przerwania nie zmienią sposobu działania uruchamiania bez debugowania.

 -2
Author: Salim Fadhley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-29 14:14:00