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

Я использую ноутбук jupyter (или Ipython) с firefox и хочу отладить некоторый код python в ячейке. Я использую 'импорт 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/

аннотированный скриншот: 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


при использовании ноутбука Jupyter начните свою ячейку с волшебной команды"%%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 указан как устаревший.

обновление:

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

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

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

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


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.

источник