Используя 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?
Ответы
Ответ 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.
источник