在numpy中,我们可以执行np.seterr(invalid='raise'),以获取引发错误的警告的回溯(参见this post)。
np.seterr(invalid='raise')
oxosxuxt1#
你可以通过赋值给warnings.showwarning来得到你想要的。警告模块文档本身建议你这样做,所以你并不是被 * 源代码的黑暗面.所诱惑。您可以通过将赋值给warnings.showwarning,将此函数替换为其他实现。你可以定义一个新的函数,它做warning.showwarning通常做的事情,并且打印堆栈。然后你把它放在原来的位置:
warnings.showwarning
warning.showwarning
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在每次触发警告时都报告它,而不仅仅是第一次,您可以包括如下内容:
warning
numpy.seterr
import warnings warnings.simplefilter("always")
您可以通过传递不同的字符串作为参数来获得其他行为。使用相同的函数,您还可以根据引发警告的模块、警告提供的消息、警告类、引发警告的代码行等,为警告指定不同的行为...您可以在模块文档中查看该列表例如,您可以设定所有警告来引发例外状况,但DeprecationWarnings例外状况应该完全忽略:
DeprecationWarnings
import warnings warnings.simplefilter("error") warnings.simplefilter("ignore", DeprecationWarning)
通过这种方式,您可以获得作为错误引发的每个警告的完整追溯(只有第一个警告,因为执行将停止......但您可以逐个解决它们,并创建一个过滤器来忽略您不希望再次听到的警告......
e37o9pze2#
运行您的程序
python -W error myprogram.py
这将使所有警告都成为致命警告,有关详细信息,请参阅此处
7dl7o3gd3#
您可以使用warnings.filterwarnings()将选取的警告转换为例外状况,并取得回溯,如下所示:
warnings.filterwarnings()
import warnings warnings.filterwarnings( 'error', 'DateTimeField .* received a naive datetime', RuntimeWarning, 'django.db.models.fields' )
eh57zj3b4#
对于Python3,请参阅warnings模块文档中的stacklevel参数。当第三方警告隐藏在调用堆栈中时,这会特别有用:将warns.warn调用参数设置为stacklevel=2,查看追溯,在必要的地方进行更改,将堆栈级别恢复/删除为原始状态。例如:
stacklevel
stacklevel=2
warnings.warn("It's dangerous to go alone! Take this.", stacklevel=2)
xdyibdwo5#
记录警告的选项,对程序流的中断最小。
在不引发错误的情况下获取跟踪:
import warnings import traceback warnings.filterwarnings("error") # Treat warnings as errors try: your_code() except Warning: print(traceback.format_exc()) # print traceback warnings.resetwarnings() # Back to default behavior
如果你想以任何一种方式执行相同(或相似)的代码,你可以在except块中执行它,这次忽略警告,因为你已经得到了它的回溯:
except
import warnings import traceback warnings.filterwarnings("error") # Treat warnings as errors try: your_code() except Warning: print(traceback.format_exc()) # print traceback warnings.filterwarnings("ignore") # ignore warnings your_code() # Execute either way (same code or alternative code) warnings.resetwarnings() # Back to default behavior
5条答案
按热度按时间oxosxuxt1#
你可以通过赋值给
warnings.showwarning
来得到你想要的。警告模块文档本身建议你这样做,所以你并不是被 * 源代码的黑暗面.所诱惑。您可以通过将赋值给
warnings.showwarning
,将此函数替换为其他实现。你可以定义一个新的函数,它做
warning.showwarning
通常做的事情,并且打印堆栈。然后你把它放在原来的位置:在此之后,每个警告都将打印堆栈跟踪和警告消息。但是,请注意,如果因为警告不是第一个警告而忽略它,则不会发生任何事情,因此您仍然需要执行:
您可以通过
warning
模块的过滤器获得类似于numpy.seterr
的控件如果您希望python在每次触发警告时都报告它,而不仅仅是第一次,您可以包括如下内容:
您可以通过传递不同的字符串作为参数来获得其他行为。使用相同的函数,您还可以根据引发警告的模块、警告提供的消息、警告类、引发警告的代码行等,为警告指定不同的行为...
您可以在模块文档中查看该列表
例如,您可以设定所有警告来引发例外状况,但
DeprecationWarnings
例外状况应该完全忽略:通过这种方式,您可以获得作为错误引发的每个警告的完整追溯(只有第一个警告,因为执行将停止......但您可以逐个解决它们,并创建一个过滤器来忽略您不希望再次听到的警告......
e37o9pze2#
运行您的程序
这将使所有警告都成为致命警告,有关详细信息,请参阅此处
7dl7o3gd3#
您可以使用
warnings.filterwarnings()
将选取的警告转换为例外状况,并取得回溯,如下所示:eh57zj3b4#
对于Python3,请参阅warnings模块文档中的
stacklevel
参数。当第三方警告隐藏在调用堆栈中时,这会特别有用:将warns.warn调用参数设置为stacklevel=2
,查看追溯,在必要的地方进行更改,将堆栈级别恢复/删除为原始状态。例如:
xdyibdwo5#
记录警告的选项,对程序流的中断最小。
在不引发错误的情况下获取跟踪:
如果你想以任何一种方式执行相同(或相似)的代码,你可以在
except
块中执行它,这次忽略警告,因为你已经得到了它的回溯: