当前位置:  开发笔记 > 编程语言 > 正文

如何在警告时自动切换到调试模式?

如何解决《如何在警告时自动切换到调试模式?》经验,为你挑选了1个好方法。

我想调试一个在代码执行过程中发生的警告.

一个简单的断点不会这样做,因为在第一次警告发生之前,导致警告的行会在没有警告的情况下执行数百万次.

此外,发生这种情况的行是在库代码中(更准确地说,在中pandas/core/common.py),所以我的首选是根本不修改代码.

我只想在发出警告时立即停止程序的执行,并在此时检查堆栈,或者使用pdb或使用ipdb.

有没有办法配置调试器在发出警告时自动进入单步模式?

user2683246.. 8

你可以写一个脚本dbg.py:

import pdb, warnings, sys
import __builtin__

if __name__ == '__main__':
    args, n = [], len(sys.argv)
    if n < 2:
        sys.exit(1)
    elif n > 2:
        args.append(__builtin__.__dict__[sys.argv[2]])
        if n > 3:
            args.append(int(sys.argv[3]))
    warnings.simplefilter('error', *args)  # treat warnings as exceptions
    try:
        execfile(sys.argv[1])
    except:
        pdb.post_mortem(sys.exc_info()[-1])

然后,您可以使用它来调试您的脚本.如果要在任何警告上运行pdb,请将脚本名称作为第一个参数传递:

$ python dbg.py yourscript.py

如果只想在引发某种特定类型的警告时运行pdb,则将警告类型作为第二个参数传递:

$ python dbg.py yourscript.py DeprecationWarning

行号作为第三个参数:

$ python dbg.py yourscript.py DeprecationWarning 342

您还可以使用warnings.filterwarnings而不是warnings.simplefilter使警告过滤更加灵活来重写代码.



1> user2683246..:

你可以写一个脚本dbg.py:

import pdb, warnings, sys
import __builtin__

if __name__ == '__main__':
    args, n = [], len(sys.argv)
    if n < 2:
        sys.exit(1)
    elif n > 2:
        args.append(__builtin__.__dict__[sys.argv[2]])
        if n > 3:
            args.append(int(sys.argv[3]))
    warnings.simplefilter('error', *args)  # treat warnings as exceptions
    try:
        execfile(sys.argv[1])
    except:
        pdb.post_mortem(sys.exc_info()[-1])

然后,您可以使用它来调试您的脚本.如果要在任何警告上运行pdb,请将脚本名称作为第一个参数传递:

$ python dbg.py yourscript.py

如果只想在引发某种特定类型的警告时运行pdb,则将警告类型作为第二个参数传递:

$ python dbg.py yourscript.py DeprecationWarning

行号作为第三个参数:

$ python dbg.py yourscript.py DeprecationWarning 342

您还可以使用warnings.filterwarnings而不是warnings.simplefilter使警告过滤更加灵活来重写代码.

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有