在单元格jupyter笔记本中关闭警告

Mar*_*nix 16 warnings python-3.x jupyter-notebook

我在python 3 jupyter笔记本中得到了一些无用的警告.我想仅在特定单元格中关闭这些警告,而不是在ipynb文件的其余部分中.有人知道怎么做吗?

小智 17

写入%%capture单元格的第一行以捕获单元格输出.您可以使用选项--no-stderr, - no-stdout, - no-display和--output来控制将捕获的单元格输出.在这里查看更多细节.

  • 这将限制单元的所有输出,而不仅仅是警告。 (6认同)
  • FWIW 直接回答这个问题,在 Jupyter 笔记本的单元格顶部添加“%%捕获输出”似乎对我有用。 (4认同)

min*_*ins 12

解决方案

通常不需要将效果扩展到整个单元格,因为这可能会隐藏一些其他有用的消息,因此使用上下文管理器来忽略警告:

with warnings.catch_warnings():
    warnings.simplefilter('ignore')
    # Your problematic instruction(s) here
Run Code Online (Sandbox Code Playgroud)

如果有充分的理由保护整个单元,那么只需通过插入捕获“魔法”来防止stderr流显示在单元输出区域中:

%%capture --no-stderr
Run Code Online (Sandbox Code Playgroud)

位于单元格顶部(而不是缩进所有行)。


说明

最合乎逻辑的方法是在关键字引入的上下文管理器中插入触发警告的代码with。它会在有问题的代码之前和之后关闭并恢复警告系统

Python 提供了这样的上下文管理器warnings.catch_warnings

上下文管理器复制并在退出时恢复警告过滤器和函数showwarning()。如果 record参数是False(默认),上下文管理器将None在输入时返回。如果recordTrue,则返回一个列表,该列表逐渐填充对象,如自定义showwarning()函数所示(这也会抑制输出到sys.stdout)。

您还需要注册一个过滤器以对上下文管理器捕获的每个警告做出反应,否则默认过滤器保持活动状态。

Python 提供了warnings.simplefilter

在警告过滤器规格列表中​​插入一个简单的条目

它注册一些操作(ignore对于无操作、always打印警告消息等,请参阅完整说明)。

例子:

import warnings, math
import numpy as np

# We want to compute the logs of this sequence.
# But log isn't defined for values <= 0
s = [-1, 5, 2, 0]

with warnings.catch_warnings():
    warnings.simplefilter('ignore')
    r = np.log(s)

print(r)
Run Code Online (Sandbox Code Playgroud)


typ*_*uck 7

通常我想保持标准输出打开打印,所以我发现这样使用catch_warnings更好:

import warnings

def action_with_warnings():
    warnings.warn("should not appear")

with warnings.catch_warnings(record=True):
    action_with_warnings()
Run Code Online (Sandbox Code Playgroud)

它的缺点是将警告存储在内存中,但它通常不是一个显着的开销,值得简单化。即使在单个单元格中,我发现细粒度控制意味着我关心的警告不会被意外遗漏。