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

Используя ipdb для отладки кода python в одной ячейке (jupyter или Ipython)

Я использую jupyter (или Ipython) ноутбук с firefox и хочу отлаживать некоторый код python в ячейке. Я использую 'import ipdb; ipdb.set_trace() 'как точка останова, например, моя ячейка имеет следующий код:

a=4
import ipdb; ipdb.set_trace()
b=5
print a
print b

который после выполнения с Shift + Enter дает мне эту ошибку:

--------------------------------------------------------------------------
MultipleInstanceError                     Traceback (most recent call last)
<ipython-input-1-f2b356251c56> in <module>()
      1 a=4
----> 2 import ipdb; ipdb.set_trace()
      3 b=5
      4 print a
      5 print b

/home/nnn/anaconda/lib/python2.7/site-packages/ipdb/__init__.py in <module>()
     14 # You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.
     15 
---> 16 from ipdb.__main__ import set_trace, post_mortem, pm, run, runcall, runeval, launch_ipdb_on_exception
     17 
     18 pm                       # please pyflakes

/home/nnn/anaconda/lib/python2.7/site-packages/ipdb/__main__.py in <module>()
     71         # the instance method will create a new one without loading the config.
     72         # i.e: if we are in an embed instance we do not want to load the config.
---> 73         ipapp = TerminalIPythonApp.instance()
     74         shell = get_ipython()
     75         def_colors = shell.colors

/home/nnn/anaconda/lib/python2.7/site-packages/traitlets/config/configurable.pyc in instance(cls, *args, **kwargs)
    413             raise MultipleInstanceError(
    414                 'Multiple incompatible subclass instances of '
--> 415                 '%s are being created.' % cls.__name__
    416             )
    417 

MultipleInstanceError: Multiple incompatible subclass instances of TerminalIPythonApp are being created.

Такая же ошибка появляется, если я использую этот код не в jupyter-ноутбуке в браузере, а в jupyter qtconsole. Что означает эта ошибка и что делать, чтобы ее избежать? Можно ли отлаживать код в ячейке шаг за шагом, используя команды next, continue и т.д. Отладчика pdb?

4b9b3361

Ответ 1

У этой проблемы также и, похоже, она связана с версиями jupyter и ipdb.

Решение должно использовать это вместо библиотеки ipdb set_trace:

from IPython.core.debugger import Tracer
Tracer()() #this one triggers the debugger

Источник: http://devmartin.com/blog/2014/10/trigger-ipdb-within-ipython-notebook/

Аннотированный снимок экрана: Снимок экрана показывает, как Tracer()() вызовет реакцию Jupyter-ноутбука. Он приостанавливает выполнение в строке в вашем код, где вы Trace()(), и новый вход

Ответ 2

При использовании Jupyter Notebook начните свою ячейку с магической команды " %% debug". Затем в нижней части ячейки будет показана строка ipdb, которая поможет вам перемещаться по сеансу отладки. Следующие команды должны начать:

n - выполните текущую строку и перейдите к следующей строке.

c - продолжить выполнение до следующей точки останова.

Убедитесь, что вы перезапускаете ядро ​​каждый раз, когда вы принимаете решение об отладке, чтобы все переменные были только что назначены. Вы можете проверить значение каждой переменной через строку ipdb, и вы увидите, что переменная undefined, пока вы не выполните строка, которая присваивает значение этой переменной.

%%debug
import pdb
from pdb import set_trace as bp
def function_xyz():
    print('before breakpoint')
    bp() # This is a breakpoint.
    print('after breakpoint')

Ответ 3

Моя версия Jupyter 5.0.0, а моя соответствующая версия ipython - 6.1.0. Я использую

import IPython.core.debugger
dbg = IPython.core.debugger.Pdb()
dbg.set_trace()

Tracer указан как устаревший.

Update:

Я попытался использовать метод из другого ответа fooobar.com/questions/137348/... ниже, но получил ошибку:

MultipleInstanceError: Multiple incompatible subclass instances of TerminalIPythonApp are being created.

Я предпочитаю свой метод для %% debug, поскольку я могу установить точки останова в функциях, определенных в других ячейках, и запустить функцию в другой ячейке. Jupyter/IPython попадает в отладчик в моей функции, где установлена ​​точка останова, и я могу использовать обычные команды pdb. Каждому свое...

@lugger1, принятый ответ устарел.

Ответ 4

Tracer() устарел.

Использование:

from IPython.core.debugger import set_trace

а затем поместите set_trace(), где требуется точка останова.

from IPython.core.debugger import set_trace

def add_to_life_universe_everything(x):
    answer = 42
    set_trace()
    answer += x

    return answer

add_to_life_universe_everything(12)

Это прекрасно работает и приносит нам немного больше комфорта (например, подсветка синтаксиса), чем просто использование встроенного pdb.

источник