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

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

Я не уверен, что то, что я прошу, возможно вообще, но поскольку python - это интерпретатор, это может быть. Я пытаюсь внести изменения в проект с открытым исходным кодом, но поскольку на питоне нет типов, трудно понять, что переменные имеют в качестве данных и что они делают. Вы не можете просто искать документацию по типу var, так как вы не можете быть уверены, какой именно тип. Я хочу перейти к терминалу, чтобы быстро изучить типы переменных и что они делают, набрав help (var) или print (var). Я мог бы сделать это, изменив код и затем повторно запуская программу каждый раз, но это будет намного медленнее.

Скажем, у меня есть программа:

def foo():
    a = 5
    my_debug_shell()
    print a

foo()

my_debug_shell - это функция, о которой я прошу. Это переведет меня в оболочку " → > " интерпретатора python, где я могу ввести help (a), и это скажет мне, что a - целое число. Затем я набираю 'a = 7' и некоторую команду 'continue', и программа продолжает печатать 7, а не 5, потому что я ее изменил.

4b9b3361

Ответ 2

Вот решение, которое не требует изменений кода:

python -m pdb prog.py <prog_args>
(pdb) b 3
Breakpoint 1 at prog.py:3
(pdb) c
...
(pdb) p a
5
(pdb) a=7
(pdb) ...

Короче:

  • запустите свою программу под управлением отладчика
  • установить точку прерывания в заданной строке кода
  • пусть программа работает до этой точки
  • вы получаете интерактивное приглашение, которое позволяет делать то, что вы хотите (введите "помощь" для всех параметров)

Ответ 3

Однострочное частичное решение - просто положить 1/0, где вы хотите точку останова: это вызовет исключение, которое будет улавливаться отладчиком. Двумя преимуществами этого подхода являются:

  • Точки останова, установленные таким образом, надежны против модификации кода (не зависят от конкретного номера строки);

  • Не нужно import pdb для каждой отлаживаемой программы; вместо этого вместо этого можно напрямую вставить "точки останова", если это необходимо.

Чтобы поймать исключение автоматически, вы можете просто сделать python -m pdb prog.py…, а затем ввести c (ontinue), чтобы запустить программу. Когда достигается 1/0, программа завершает работу, но переменные можно проверить как обычно с помощью отладчика pdb (p my_var). Теперь это не позволяет вам исправлять ситуацию и продолжать работу с программой. Вместо этого вы можете попытаться исправить ошибку и запустить программу еще раз.

Если вы хотите использовать мощный IPython shell, ipython -pdb prog.py… делает то же самое, но приводит к лучшему интерфейсу отладчика IPython, Кроме того, вы можете делать все изнутри оболочки IPython:

  • В IPython настройте режим "debug on exception" IPython (%pdb).
  • Запустите программу с IPython с помощью %run prog.py…. Когда возникает исключение, отладчик автоматически активируется, и вы можете проверять переменные и т.д.

Преимущество этого последнего подхода состоит в том, что (1) оболочка IPython почти обязательна; и (2) после его установки отладка может быть легко выполнена через него (а не напрямую через модуль pdb). полная документация доступна на страницах IPython.

Ответ 4

Python 3.7 имеет новый встроенный способ установки точек останова.

breakpoint()

Реализация breakpoint() import pdb и вызывает pdb.set_trace().

Не забудьте включить скобки (), так как breakpoint - это функция, а не ключевое слово.

Ответ 5

Вы можете запустить программу с помощью pdb и добавить контрольные точки перед запуском.

В действительности же, как правило, так же быстро редактировать код и вставлять вызов set_trace(), как заявил другой пользователь.

Ответ 6

Не уверен, что такое настоящий вопрос. Python предоставляет вам отладчик "pdb" (сам Google) и, кроме того, вы можете добавлять данные для ведения журнала и отладки по мере необходимости.