在异常时启动IPython shell
有没有办法在我的程序运行到出错的地方时,启动一个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
的范围内,毫无问题地读取它的变量z
和g
。即使不设置-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)