it-swarm.com.ru

использование 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?

50
lugger1

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

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

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

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

Аннотированный скриншот: screenshot illustrate how Tracer()() will cause Jupyter notebook to react. It pauses execution on the line in your code where you Trace()() and a new "inline" input accepts ipdb commands like 'p' or 'n' or 'c', shown here

87
Robert Muil

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

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

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

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

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

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.

источник

9
Mattijn

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

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

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

Обновление:

Я попытался использовать метод из другого ответа https://stackoverflow.com/a/43086430/8019692 ниже, но получил ошибку:

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

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

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

9
Dale Smith