62

我正在使用带有 firefox 的 jupyter(或 Ipython)笔记本,并且想在单元格中调试一些 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 notebook 中使用此代码,而是在 jupyter qtconsole 中使用此代码,则会出现相同的错误。这个错误是什么意思以及如何避免它?是否可以使用 pdb 调试器的 next、continue 等命令逐步调试单元格中的代码?

4

4 回答 4

96

也有这个问题,它似乎与 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 notebook 做出反应。 它会在您的代码中 Trace()() 和新的行暂停执行

于 2016-03-03T13:19:21.947 回答
17

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 相比,这可以正常工作并为我们带来更多的舒适感(例如语法突出显示)。

资源

于 2017-11-23T08:56:34.337 回答
13

如果使用 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')
于 2017-03-29T06:57:01.133 回答
9

我的 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,已弃用接受的答案。

于 2017-06-13T13:14:30.657 回答