我需要生成 IPython 会话的截屏视频,为了避免让观众感到困惑,我想禁用来自不同包的
warnings.warn
调用发出的所有警告。有没有办法配置 ipythonrc 文件以自动禁用所有此类警告?
地点:
import warnings
warnings.filterwarnings('ignore')
里面
~/.ipython/profile_default/startup/disable-warnings.py
。
经常看到一次警告是很有用的。可以通过以下方式设置:
warnings.filterwarnings(action='once')
我通过在单元格中运行以下代码来隐藏粉红色框中的警告:
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>.''')
接受的答案在 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);
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>.''')
warnings.filterwarnings("ignore", category=DeprecationWarning)
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
以忽略警告并开始打印警告。