在异常时启动IPython shell

57 投票
10 回答
18410 浏览
提问于 2025-04-16 07:23

有没有办法在我的程序运行到出错的地方时,启动一个IPython的命令行界面?

我主要想知道出错时的上下文和变量,特别是在出错的地方和它的子范围内的变量。就像在Visual Studio调试一样,当出现异常但没有被捕获时,Visual Studio会暂停程序,并给我显示调用栈和每一层的变量。

你觉得用IPython能实现类似的功能吗?

编辑:启动IPython时使用的-pdb选项似乎没有达到我想要的效果(或者可能是我不知道怎么正确使用它,这也有可能)。我运行了以下脚本:

def func():
    z = 2
    g = 'b'
    raise NameError("This error will not be caught, but IPython still"
                    "won't summon pdb, and I won't be able to consult"
                    "the z or g variables.")

x = 1
y = 'a'

func()

使用的命令是:

ipython -pdb exceptionTest.py

这个命令在出错时会停止执行,但给我一个IPython的提示符,让我可以访问脚本的全局变量,但无法访问函数func的局部变量。pdb只有在我直接在IPython中输入一个导致错误的命令时才会被调用,比如raise NameError("这个,从IPython提示符发送的,将触发pdb。")

我不一定需要使用pdb,我只是想访问func内部的变量。

编辑 2:过了一段时间,IPython的-pdb选项现在正好按我想要的那样工作了。这意味着当我抛出异常时,我可以回到func的范围内,毫无问题地读取它的变量zg。即使不设置-pdb选项,也可以在交互模式下运行IPython,然后在程序出错退出后调用魔法函数%debug——这也会让你进入一个交互式的ipdb提示符,所有范围的变量都可以访问。

10 个回答

24

你可以试试这个:

from ipdb import launch_ipdb_on_exception

def main():
    with launch_ipdb_on_exception():
        # The rest of the code goes here.
        [...]
28

正在进行:

ipython --pdb -c "%run exceptionTest.py"

这段代码会在IPython初始化后启动脚本,然后你就会进入普通的IPython加pdb环境。

27

关于 IPython v0.13 的更新:

import sys
from IPython.core import ultratb
sys.excepthook = ultratb.FormattedTB(mode='Verbose',
     color_scheme='Linux', call_pdb=1)

撰写回答