我想调试一个在代码执行过程中发生的警告.
一个简单的断点不会这样做,因为在第一次警告发生之前,导致警告的行会在没有警告的情况下执行数百万次.
此外,发生这种情况的行是在库代码中(更准确地说,在中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
使警告过滤更加灵活来重写代码.
你可以写一个脚本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
使警告过滤更加灵活来重写代码.