Перейти в середине программы Python Interactive Session? - PullRequest
12 голосов
/ 29 мая 2009

Эй, мне было интересно ... Я использую pydev с eclipse, и мне действительно нравятся мощные функции отладки, но мне было интересно:

Можно ли установить точку прерывания в затмении и перейти в интерактивный интерпретатор python во время выполнения?

Думаю, это было бы очень удобно;)

edit : Хочу подчеркнуть, что моя цель - не прыгать в отладчик. У pydev / eclipse отличный отладчик, и я могу просто посмотреть трассировку и установить точки останова.

Я хочу выполнить скрипт и перейти к интерактивному интерпретатору python во время выполнения, чтобы я мог делать такие вещи, как ...

  • ковыряться
  • проверить значения вещей
  • манипулировать переменными
  • выясните код, прежде чем добавить его в приложение

Я знаю, что вы можете сделать все это с помощью отладчика, но я могу сделать это быстрее в интерактивном интерпретаторе, потому что я могу попробовать что-то, увидеть, что это не сработало, и попробовать что-то еще, не возвращая приложение обратно точка повторного выполнения этого кода.

Ответы [ 6 ]

9 голосов
/ 06 сентября 2010

Итак, примерно через год после вопроса ОП, в PyDev встроена эта возможность. Я не уверен, когда эта функция была введена, но все, что я знаю, это то, что я потратил последние 2 часа на поиск в Google ... настройку iPython что угодно (что выглядело так, как будто это сделало бы эту работу), но только для того, чтобы понять, что Eclipse / PyDev имеет то, что я хочу ootb.

Как только вы нажмете точку останова в режиме отладки, консоль будет готова и ждет! Я только не заметил этого, поскольку нет подсказки или мигающего курсора; Я ошибочно предположил, что это стандартная консоль только для вывода, но это не так. У него даже есть завершение кода.

Отличный материал, подробности см. http://pydev.org/manual_adv_debug_console.html.

6 голосов
/ 07 июня 2009

Это из старого проекта, и я не писал его, но он делает нечто похожее на то, что вы хотите, используя 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)

редактирование Джимом Робертом (владелец вопроса) : Если вы поместите вышеуказанный код в файл с именем my_debug.py для примера Затем поместите этот файл в путь Python, и вы можете вставить следующие строки в любом месте своего кода, чтобы перейти в отладчик (если вы выполняете из оболочки):

import my_debug
my_debug.db()
2 голосов
/ 05 июня 2009

Вы можете перейти в интерактивный сеанс, используя code.InteractiveConsole, как описано здесь ; однако я не знаю, как вызвать это из Eclipse.

Решением может быть перехват Ctrl + C для перехода в эту интерактивную консоль (с использованием модуля signal : signal.signal(signal.SIGINT, my_handler)), но это, вероятно, изменит контекст выполнения, и вы, вероятно, не захотите это.

2 голосов
/ 29 мая 2009

Я давно использую этот код в своем sitecustomize.py, чтобы запустить отладчик для исключения. Это также может быть вызвано Ctrl + C. Прекрасно работает в оболочке, не знаю про затмение.

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

Вот источник и дополнительные обсуждения StackOverflow .

1 голос
/ 06 июня 2009

Не совсем ответ на ваш вопрос, а просто указатель на iPython. На всякий случай, если вы не знаете об этом. Я использую его параллельно с eclipse / pydev только для таких вещей.

Информация о внедрении iPython в ваше собственное приложение. Это дает возможность делать то, что вы ищете, если вы хотите сделать это за пределами eclipse / pydev.

0 голосов
/ 29 мая 2009

Если вы уже работаете в режиме отладки, вы можете установить дополнительную точку останова, если выполнение программы в данный момент приостановлено (например, потому что вы уже находитесь в точке останова). Я только что попробовал это сейчас с последним Pydev - он работает просто отлично.

Если вы работаете нормально (т.е. не в режиме отладки), все точки останова будут игнорироваться. Никакие изменения в точках останова не повлияют на работу без отладки.

...