Warnings:获取警告的回溯(the warnings)

在 numpy 中,我们可以执行np.seterr(invalid='raise')以获取引发错误的警告的回溯(请参阅this post)。

是否有跟踪警告的一般方法?

我可以让 python 给一个回溯,当一个警告提出?

134

你可以通过分配给warnings.showwarning来得到你想要的。warnings module documentation本身建议你这样做,所以这并不是说你受到了源黑暗面的诱惑。:)

您可以通过分配给warnings.showwarning来替换此函数。

您可以定义一个新函数,该函数执行warning.showwarningnormaly 所做的操作,并另外打印堆栈。

import traceback
import warnings
import sys
def warn_with_traceback(message, category, filename, lineno, file=None, line=None):
    log = file if hasattr(file,'write') else sys.stderr
    traceback.print_stack(file=log)
    log.write(warnings.formatwarning(message, category, filename, lineno, line))
warnings.showwarning = warn_with_traceback

之后,每个警告都会打印堆栈跟踪以及警告消息。但是,请考虑到,如果警告被忽略,因为它不是第一个,什么都不会发生,所以您仍然需要执行:

warnings.simplefilter("always")

您可以通过warning模块的过滤器获得一个类似的控制numpy.seterr

如果你想要的是 python 每次触发时报告每个警告,而不仅仅是第一次,你可以包括:

import warnings
warnings.simplefilter("always")

您可以通过传递不同的字符串作为参数来获得其他行为。使用相同的函数,您还可以为警告指定不同的行为,具体取决于引发它们的模块,它们提供的消息,警告类,导致它的代码行等等...

您可以在module documentation中检查列表

例如,您可以设置所有警告以引发异常,但应完全忽略的DeprecationWarnings除外:

import warnings
warnings.simplefilter("error")
warnings.simplefilter("ignore", DeprecationWarning)

这样,您可以获得每个警告的完整回溯,因为错误(只有第一个,因为执行将停止...但是您可以一个接一个地解决它们,并创建一个过滤器以忽略您不想听到的那些再次...

40

像这样运行你的程序

python -W error myprogram.py

这会使所有警告致命,有关详细信息,请参阅here

4

您可以使用warnings.filterwarnings()将选定的警告转换为异常并获取回溯,如下所示:

import warnings
warnings.filterwarnings(
    'error', 'DateTimeField .* received a  datetime',
    RuntimeWarning, 'django.db.models.fields'
)
1

对于 Python3,请参阅warnings模块文档中的stacklevel参数。当第三方警告隐藏在调用堆栈中时,这可能特别有用:将 warnings.warn 调用参数设置为stacklevel=2,请参阅回溯,在必要时进行更改,将堆栈级别恢复 / 删除为原始状态。

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(834)
I deans:python:在列表中为i打印i
上一篇
Python与财务的结合:在Python中将XPath与 LXML结合使用
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(43条)