隐藏 IPython 中的所有警告

问题描述 投票:0回答:6

我需要生成 IPython 会话的截屏视频,为了避免让观众感到困惑,我想禁用来自不同包的

warnings.warn
调用发出的所有警告。有没有办法配置 ipythonrc 文件以自动禁用所有此类警告?

python warnings ipython
6个回答
1256
投票

地点:

import warnings
warnings.filterwarnings('ignore')

里面

~/.ipython/profile_default/startup/disable-warnings.py

经常看到一次警告是很有用的。可以通过以下方式设置:

warnings.filterwarnings(action='once')

65
投票

我通过在单元格中运行以下代码来隐藏粉红色框中的警告:

from IPython.display import HTML
HTML('''<script>
code_show_err=false; 
function code_toggle_err() {
 if (code_show_err){
 $('div.output_stderr').hide();
 } else {
 $('div.output_stderr').show();
 }
 code_show_err = !code_show_err
} 
$( document ).ready(code_toggle_err);
</script>
To toggle on/off output_stderr, click <a href="javascript:code_toggle_err()">here</a>.''')

14
投票

接受的答案在 Jupyter 中不起作用(至少在使用某些库时)。

此处的 JavaScript 解决方案仅隐藏已经显示的警告,但不隐藏将来会显示的警告。

为了在 Jupyter 和 JupyterLab 中隐藏/取消隐藏警告,我编写了以下脚本,该脚本本质上是切换 CSS 来隐藏/取消隐藏警告。

%%javascript (function(on) { const e = $("<a>Setup failed</a>"); const ns = "js_jupyter_suppress_warnings"; var cssrules = $("#" + ns); if(!cssrules.length) cssrules = $("<style id='" + ns + "' type='text/css'>div.output_stderr { } </style>").appendTo("head"); e.click(function() { var s = 'Showing'; cssrules.empty() if(on) { s = 'Hiding'; cssrules.append("div.output_stderr, div[data-mime-type*='.stderr'] { display:none; }"); } e.text(s + ' warnings (click to toggle)'); on = !on; }).click(); $(element).append(e); })(true);
    

5
投票
对于

JupyterLab,这应该有效(@Alasja):

from IPython.display import HTML HTML('''<script> var code_show_err = false; var code_toggle_err = function() { var stderrNodes = document.querySelectorAll('[data-mime-type="application/vnd.jupyter.stderr"]') var stderr = Array.from(stderrNodes) if (code_show_err){ stderr.forEach(ele => ele.style.display = 'block'); } else { stderr.forEach(ele => ele.style.display = 'none'); } code_show_err = !code_show_err } document.addEventListener('DOMContentLoaded', code_toggle_err); </script> To toggle on/off output_stderr, click <a onclick="javascript:code_toggle_err()">here</a>.''')
    

2
投票
您需要指定类别,否则即使使用上面的最佳解决方案,您也会收到警告

warnings.filterwarnings("ignore", category=DeprecationWarning)
    

0
投票

TL;DR: 当您拨打filterwarnings

 时,这一点很重要。将 
warnings.filterwarnings(action="ignore")
 放在所有导入之后。换句话说,做:

import warnings import third_party_module from a_cool_module import UsefulObject warnings.filterwarnings(action="ignore") # <--- ignore after imports # no other imports after this line

一些解释: 许多库在其 __init__.py 中都有 warnings.filterwarnings("default", SomeDeprecationWarning)

 或类似的内容,因此,如果您在导入任何模块之前运行 
warnings.filterwarnings("ignore")
(例如,在笔记本的顶部,甚至在 ipy_user_conf.py 文件中),并且您导入对象,你最终会用模块的调用覆盖你自己的 
filterwarnings
 调用
filterwarning
 调用最终会打印一条警告。它类似于以下内容:

import warnings warnings.filterwarnings(action="ignore") warnings.filterwarnings(action="default") warnings.warn("bla bla") # <--- warning printed

import warnings warnings.filterwarnings(action="default") warnings.filterwarnings(action="ignore") warnings.warn("bla bla") # <--- warning is not shown
当您已经运行包含在笔记本开头隐藏警告的代码的单元格,然后从第三方库(例如 pandas、matplotlib、scikit-learn 等)导入到下面的单元格中时,尤其会发生这种情况笔记本执行一些特定任务,覆盖之前的 

filterwarnings

 以忽略警告并开始打印警告。

© www.soinside.com 2019 - 2024. All rights reserved.