使用Python中的joblib在并行执行期间抑制警告

10

我正在使用一个生成警告的函数,但实际上我并不需要阅读这些警告。问题在于,我想并行运行这个函数,但是似乎无法再次抑制警告。请看以下示例:

import warnings
import numpy as np
from joblib import Parallel, delayed

def test(a, b):
    if a * b > 10:
        warnings.warn("You are being warned!!")
    return(a*b)

ii = np.arange(5)
jj = ii + 1

with warnings.catch_warnings():
    warnings.filterwarnings("ignore")
    with Parallel(n_jobs=4) as parallel:
        result = parallel(delayed(test)(i, j) for i, j in zip(ii, jj))

这仍然会产生警告信息... 请注意,在我的情况下,我无法重写函数test,因为它是从另一个包中导入的。是否有任何方法可以不收到警告信息?

1个回答

7

是的,这非常令人恼火!

默认的joblib后端会生成额外的进程,这些进程似乎不会继承使用warnings.filterwarnings应用的警告过滤器。但是,您可以使用 PYTHONWARNINGS 环境变量来设置警告过滤器;这将影响所有新生成的进程,它们从主进程中继承其环境变量。

来自相关文档页面

警告过滤器由传递给Python解释器命令行的-W选项和PYTHONWARNINGS环境变量初始化。解释器保存所有提供的条目的参数,在sys.warnoptions中不进行解释。当第一次导入warnings模块时,warnings模块解析这些参数(无效选项被忽略,并在打印到sys.stderr的消息之后)。

单个警告过滤器被指定为由冒号分隔的字段序列:

action:message:category:module:line

一个单独的页面更详细地描述了每个字段的含义,但基本上:

  • action描述对警告的处理方式;对于您,您需要ignore来屏蔽消息
  • message可以是必须匹配警告消息开头才能进行过滤的字符串
  • category是警告类,例如FutureWarningDeprecationWarning
  • moduleline指的是发出警告的位置

其中任何一个字段都可以为空,并且可以省略分号。

因此,要忽略所有FutureWarning

在Jupyter笔记本中,您可以执行以下操作:

%env PYTHONWARNINGS=ignore::FutureWarning

或者在脚本中,向os.environ添加一个条目:

import os
os.environ['PYTHONWARNINGS']='ignore::FutureWarning'

看起来应该有一种方式只为派生的进程设置环境变量,但我无法确定joblib是否公开了这方面的API。


为了忽略所有警告,您应该将环境变量设置为 "ignore"os.environ["PYTHONWARNINGS"] = "ignore" - BiBi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接