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

4 ответа

Решение

Была эта проблема также, и, кажется, она связана с версиями 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 () (), и новый

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.

источник

Если вы используете 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')

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

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

Tracer занесен в список устаревших

Обновить:

Я попытался использовать метод из другого ответа /questions/14939930/ispolzovanie-ipdb-dlya-otladki-koda-python-v-odnoj-yachejke-jupyter-ili-ipython/14939934#14939934 ниже, но получил ошибку:

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

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

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

Другие вопросы по тегам