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

Локальная интерактивная отладка Python с IPython

Скажем, у меня есть сеанс IPython, из которого я вызываю script:

> run my_script.py

Есть ли способ вызвать точку останова в my_script.py, из которой я могу проверить мое рабочее пространство на IPython?

Я помню, что читал, что в предыдущих версиях IPython можно было:

from IPython.Debugger import Tracer;     

def my_function():
    x = 5
    Tracer()
    print 5;

но подмодуль Debugger, похоже, больше не доступен.

Предполагая, что у меня уже открыт сеанс IPython: , как я могу остановить свою программу по своему выбору и проверить мое рабочее пространство с помощью IPython?

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

4b9b3361

Ответ 1

Tracer() все еще существует в ipython в другом модуле. Вы можете сделать следующее:

from IPython.core.debugger import Tracer

def my_function():
    x = 5
    Tracer()()
    print 5

Обратите внимание на дополнительные круглые скобки для звонков вокруг Tracer

изменить: Tracer устарел, вы должны использовать set_trace() вместо

Ответ 2

Вы можете запустить его и установить точку останова в заданной строке с помощью:

run -d -b12 myscript

Где -b12 устанавливает точку останова в строке 12. Когда вы вводите эту строку, вы сразу же перейдете в pdb, и вам нужно будет ввести c для выполнения до этой точки останова.

Ответ 3

Это версия, использующая метод set_trace() вместо устаревшего Tracer().

from IPython.core.debugger import Pdb

def my_function():
    x = 5
    Pdb().set_trace()
    print 5

Ответ 4

Внутри оболочки IPython вы можете сделать

from IPython.core.debugger import Pdb
pdb = Pdb()
pdb.runcall(my_function)

например, или выполните нормальную pdb.set_trace() внутри вашей функции.

Ответ 5

У меня всегда был один и тот же вопрос, и наилучшее обходное решение, которое я нашел, которое довольно хаки, - это добавить строку, которая сломает мой код, например:

...
a = 1+2
STOP
...

Тогда, когда я запустил этот код, он сломается, и я смогу сделать% debug, чтобы пойти туда и проверить. Вы также можете включить% pdb, чтобы всегда переходить к точке, где ваш код ломается, но это может быть надоедливым, если вы не хотите проверять везде и каждый раз, когда ваш код ломается. Мне хотелось бы более элегантное решение.