调用ipdb的快捷方式?

时间:2017-10-15 12:31:40

标签: python ipdb

ipdb很棒;哇。问题是,当一个脚本爆炸时,我仍然需要进入代码并添加四行,这些行不需要输入 ton ,但也没有。例如,假设这是坏线:

public YourFragment getYourFragment() {
YourFragmentt yourFragment = null;
if (getChildFragmentManager() != null) {
 List<Fragment> fragments =getChildFragmentManager().getFragments();
if (fragments != null) {
for (Fragment fragment : fragments) {
 if (fragment instanceof yourFragmentFragment) {
yourFragment = (YourFragment) fragment;
  break;
}
}
}
}
return yourFragment;
}

当然,我明白了:

1 = 2

如果出于某种原因我想调试该行并查看该行之前(或当时堆栈中的其他位置)发生了什么,我通常会更改该行代码,如下所示:

SyntaxError: can't assign to literal

这可以完成工作,但是我希望能够以“模式”运行脚本,无论什么时候爆炸(假设异常未处理),我得到相同的结果。

存在吗?

******* ******* EDIT

感谢@ np8的回复,我将驱动程序脚本重写为这样(try: 1 = 2 except: import traceback;traceback.print_exc() import ipdb;ipdb.set_trace() 是任意函数):

main

这允许我从命令行确定异常是否应该启动ipdb(即我正在开发时)(即当脚本在生产中运行时因此详细程度参数低于2,在此示例中) )。

3 个答案:

答案 0 :(得分:0)

您正在寻找的是“事后调试”。获得所需内容的最简单方法是使用

运行脚本
ipdb script.py

python -m pdb script.py

而不是

python script.py

答案 1 :(得分:0)

您可以使用launch_ipdb_on_exception上下文管理器:

# test.py
from ipdb import launch_ipdb_on_exception

with launch_ipdb_on_exception():
    print(x)

运行上述操作将导致启动ipdb:

python .\test.py
NameError("name 'x' is not defined",)
> c:\tmp\delete_me\test.py(4)<module>()
      2
      3 with launch_ipdb_on_exception():
----> 4     print(x)

ipdb>

答案 2 :(得分:0)

pm 是一个函数装饰器,它反映了 ipdb 上下文管理器 launch_ipdb_on_exception。用它来装饰 一个函数,该函数将在出错时转到 ipdb。 “pm”这个名字来自 ipdb.pm() 函数,它代表 事后分析,行为类似。

有了这个,你可以用 @pm 修饰你想要调试的顶级函数,并且调用堆栈中该级别或以下级别的任何异常都将触发 ipdb。

import ipdb


class Decontext(object):
    """
    Makes a context manager also act as decorator
    """
    def __init__(self, context_manager):
        self._cm = context_manager

    def __enter__(self):
        return self._cm.__enter__()

    def __exit__(self, *args, **kwds):
        return self._cm.__exit__(*args, **kwds)

    def __call__(self, func):
        def wrapper(*args, **kwds):
            with self:
                return func(*args, **kwds)
        return wrapper

pm = Decontext(ipdb.launch_ipdb_on_exception())