获取Python程序中运行时警告发生的位置(后验)
我有一个大的4D大脑图像数据集。我在图像中的3d for循环中迭代,以在每个体素中运行一些过程(例如,非线性拟合+MCMC)。for循环是并行的。有时,我会收到运行时警告(例如,获取Python程序中运行时警告发生的位置(后验),python,logging,iteration,warnings,raiseevent,Python,Logging,Iteration,Warnings,Raiseevent,我有一个大的4D大脑图像数据集。我在图像中的3d for循环中迭代,以在每个体素中运行一些过程(例如,非线性拟合+MCMC)。for循环是并行的。有时,我会收到运行时警告(例如,ComplexWarning:Casting complex value to real会丢弃虚部或RuntimeWarning:true\u divide中遇到无效值)。事实上,产生运行时警告的函数是非常明确的,只是体素在不同的4D图像之间发生变化 大多数时候,这些警告是有意义的,并且位于我不关心的嘈杂体素中。因此,当
ComplexWarning:Casting complex value to real会丢弃虚部
或RuntimeWarning:true\u divide中遇到无效值
)。事实上,产生运行时警告的函数是非常明确的,只是体素在不同的4D图像之间发生变化
大多数时候,这些警告是有意义的,并且位于我不关心的嘈杂体素中。因此,当这些警告发生时(这是我在阅读的所有So问题中发现的),我不想引发错误或异常(即停止执行),我只想激活一个标志,创建一个掩码或将坐标/for循环迭代导出到日志文件(以及引发的警告消息,以了解发生了什么)。通过这种方式,我可以运行所有程序,并检查警告在哪里
最好的方法是什么?是否有任何“通用”方法将其应用于整个代码而不是特定函数
例如,一个可能的伪代码(尽管我猜在每次迭代中执行2个if不是一个关于性能的好主意……):
导入日志
wrn_log=logging.getLogger()
掩码警告=np.类零(数据)
[...]
对于范围(0,尺寸[0])内的x:
对于范围(0,尺寸[1])内的y:
对于范围(0,尺寸[2])内的z:
res1=foo1(数据)
res2=foo2(res1)
res3=foo3(res2)#此函数中会出现一些警告
如果出现运行时警告:
掩码警告=保存警告(x、y、z、掩码警告、警告消息、警告日志)
res4=foo4(res3)
res5=foo5(res4)#此函数中会出现一些警告
如果出现运行时警告:
掩码警告=保存警告(x、y、z、掩码警告、警告消息、警告日志)
def保存警告(x、y、z、警告消息、警告日志):
wrn_log.info(f'In{x},{y},{z}--{wrn_msg})
遮罩警告[x,y,z]=1
返回掩码警告