Debugging 使用ipdb在一个单元(jupyter或Ipython)中调试python代码

Debugging 使用ipdb在一个单元(jupyter或Ipython)中调试python代码,debugging,cell,jupyter,ipdb,Debugging,Cell,Jupyter,Ipdb,我正在将jupyter(或Ipython)笔记本与firefox一起使用,并希望在计算单元中调试一些python代码。我正在使用“导入ipdb”;ipdb.set_trace()'作为一种断点,例如我的单元格有以下代码: a=4 import ipdb; ipdb.set_trace() b=5 print a print b 使用Shift+Enter执行后,会出现以下错误: ----------------------------------------------------------

我正在将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.
--------------------------------------------------------------------------
MultipleInstanceError回溯(最近一次调用上次)
在()
1A=4
---->2进口ipdb;ipdb.set_trace()
3 b=5
4打印一份
5打印b
/home/nnn/anaconda/lib/python2.7/site packages/ipdb/__init__;u.py in()
14#您应该已经收到GNU通用公共许可证的副本以及本程序。如果没有,请参阅http://www.gnu.org/licenses/.
15
--->16来自ipdb。主导入集跟踪、事后检查、pm、运行、运行调用、运行评估、启动ipdb
17
下午18点,请给我拿几片
/home/nnn/anaconda/lib/python2.7/site packages/ipdb/\uuuuuu main\uuuuuuuuuu.py in()
71#实例方法将在不加载配置的情况下创建一个新实例。
72#即:如果我们在嵌入实例中,我们不想加载配置。
--->73 ipapp=TerminalIPythonApp.instance()
74 shell=get_ipython()
75定义颜色=外壳颜色
/实例中的home/nnn/anaconda/lib/python2.7/site-packages/traitlets/config/configurable.pyc(cls,*args,**kwargs)
413上升倍数安装错误(
414“的多个不兼容子类实例”
-->415正在创建“%s”。%cls.\u名称__
416             )
417
MultipleInstanceError:正在创建TerminalIPythonApp的多个不兼容子类实例。
如果我不是在浏览器的jupyter笔记本中使用此代码,而是在jupyter控制台中使用此代码,则会出现相同的错误。 这个错误意味着什么?如何避免它?
是否可以使用pdb debugger的next、continue等命令在单元格中一步一步地调试代码?

也有此问题,它似乎与jupyter和ipdb的版本有关

解决方案是使用此函数而不是ipdb库
set\u trace
调用:

来自IPython.core.debugger导入跟踪程序
Tracer()()#这个会触发调试器
资料来源:

带注释的屏幕截图: 如果使用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
被列为已弃用

更新:

我尝试使用下面另一个答案中的方法,但出现错误:

MultipleInstanceError:正在创建TerminalIPythonApp的多个不兼容子类实例。

我更喜欢我的方法而不是%%debug魔术,因为我可以在其他单元格中定义的函数中设置断点,并在其他单元格中运行该函数。Jupyter/IPython放入我函数中设置断点的调试器,我可以使用通常的
pdb
命令。每个人都有自己的

@lugger1,接受的答案已弃用。

Tracer()
已弃用

使用:

从IPython.core.debugger导入集\u 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工作得更好,给我们带来了更多的舒适感(例如语法突出显示)


谢谢,罗伯特,这个解决方案似乎有效。我可以进入ipdb提示符,检查并打印我的变量。然而,任何继续(c)或执行下一个语句(n)的尝试都会杀死内核!每次尝试这样做时,我都会在浏览器中看到“死内核”,或者在控制台中看到sys.excepthook=old_excepthook with SystemExit exception。你也有同样的问题吗?@lugger1不,我没有那个问题。这对我很管用。恐怕我不知道是什么原因造成的。升级版本?这对我来说很好,并且不会破坏内核。谢谢你,罗伯特!Ctrl-D不起作用,但是
exit
quit
为我做的
Tracer()
都不推荐使用。使用IPython.core.debugger中的
导入set_trace
,然后将
set_trace()
放置在需要断点的位置。我添加了一段代码,解释了如何在Jupyter笔记本中添加断点。
将set_trace导入为bp
,这很有趣,
set_trace()
感觉就像设置断点一样:)这一行代码对我很有用:
来自IPython.core.debugger import Pdb;Pdb().设置跟踪()