Перейти в среднюю программу Interactive Session на Python?
Эй, мне было интересно... Я использую pydev с eclipse, и мне действительно нравятся мощные функции отладки, но мне было интересно:
Можно ли установить контрольную точку в затмении и перейти в интерактивный интерпретатор python во время выполнения?
Я думаю, что это было бы очень удобно;)
edit. Я хочу подчеркнуть, что моя цель - не переходить в отладчик. pydev/eclipse имеют отличный отладчик, и я могу просто посмотреть на трассировку и установить точки останова.
Я хочу выполнить script и перейти в интерактивный интерпретатор python во время выполнения, чтобы я мог делать такие вещи, как...
- тыкать вокруг
- проверить значения вещей
- управлять переменными
- определите код, прежде чем добавить его в приложение.
Я знаю, что вы можете сделать все это с помощью отладчика, но я могу сделать это быстрее в интерактивном интерпретаторе, потому что я могу что-то попробовать, увидеть, что он не работает, и попробовать что-то еще, не вернув приложение обратно пункт выполнения этого кода снова.
Ответы
Ответ 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 - он работает отлично.
Если вы работаете нормально (т.е. не в режиме отладки), все точки останова будут проигнорированы. Никакие изменения в контрольных точках не изменят способ работы без отладки.