在异常时启动IPython shell

lev*_*que 47 python debugging ipython

当我的程序运行引发异常的行时,有没有办法启动IPython shell或提示?

我最感兴趣的是引发异常的范围(和子范围)中的上下文,变量.像Visual Studio的调试,当抛出异常但没有被任何人捕获时,Visual Studio将停止并给我调用堆栈和每个级别的变量.

你认为有一种方法可以使用IPython获得类似的东西吗?

编辑:-pdb启动IPython 的选项似乎没有做我想要的(或者我可能不知道如何正确使用它,这是完全可能的).我运行以下脚本:

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()
Run Code Online (Sandbox Code Playgroud)

使用命令:

ipython -pdb exceptionTest.py
Run Code Online (Sandbox Code Playgroud)

这会在引发错误时停止执行,但会给我一个IPython提示符,其中我可以访问脚本的全局变量,但不能访问函数func的局部变量.pdb只在我在ipython中直接输入导致错误的命令时调用,即raise NameError("This, sent from the IPython prompt, will trigger pdb.").

我不一定需要使用pdb,我只想访问里面的变量func.

编辑2:已经有一段时间了,IPython的-pdb选项现在正如我想要的那样工作.这意味着当我提出异常时,我可以返回范围func并读取其变量zg没有任何问题.即使没有设置-pdb选项,也可以在交互模式下运行IPython,然后%debug在程序退出错误后调用magic函数- 这也会使您进入交互式ipdb提示符,并且所有作用域都可访问.

Ada*_*all 24

IPython v0.13的更新:

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


rco*_*oup 19

这样做:

ipython --pdb -c "%run exceptionTest.py"
Run Code Online (Sandbox Code Playgroud)

在IPython初始化之后启动脚本并且您将进入正常的IPython + pdb环境.


jon*_*jon 12

ipdb将IPython功能集成到pdb中.我使用以下代码将我的应用程序放入IPython调试器后,在一个无法处理的异常之后.

import sys, ipdb, traceback

def info(type, value, tb):
    traceback.print_exception(type, value, tb)
    ipdb.pm()

sys.excepthook = info
Run Code Online (Sandbox Code Playgroud)

  • ipdb还有一个方便的上下文管理器:`launch_ipdb_on_exception()` (4认同)

bco*_*lan 7

@ snapshoe的答案不适用于较新版本的IPython.

但是这样做:

import sys 
from IPython import embed

def excepthook(type, value, traceback):
    embed()

sys.excepthook = excepthook
Run Code Online (Sandbox Code Playgroud)


Sar*_*ica 7

您可以尝试以下方法:

from ipdb import launch_ipdb_on_exception

def main():
    with launch_ipdb_on_exception():
        # The rest of the code goes here.
        [...]
Run Code Online (Sandbox Code Playgroud)