Подтвердить что ты не робот

Перейти в среднюю программу Interactive Session на Python?

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

Я уже давно использую этот код в своем 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

Здесь источник и fooobar.com/questions/11420/....

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

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