【问题标题】:turn warning off in a cell jupyter notebook在单元格 jupyter 笔记本中关闭警告
【发布时间】:2017-02-27 13:59:27
【问题描述】:

我在 python 3 jupyter notebook 中收到一些无用的警告。我只想在特定单元格中关闭这些警告,而不是在 ipynb 文件的其余部分中。 有人知道怎么做吗?

【问题讨论】:

  • 您可以使用 catch_warnings() 上下文管理器暂时关闭所有 Python 警告。
  • 这个答案对你有用吗?从这个答案使用这条线warnings.filterwarnings(action='once')stackoverflow.com/a/9031848/4538920
  • "我只想在特定单元格中关闭这些警告":除非单元格中有一条指令,否则您可能希望禁用 的警告一些指令,不适用于cell

标签: python-3.x warnings jupyter-notebook


【解决方案1】:

%%capture 作为单元格的第一行以捕获单元格输出。您可以使用选项--no-stderr--no-stdout--no-display--output 来控制将捕获哪些单元格输出。查看更多详情here.

【讨论】:

  • 这会抑制单元格的所有输出,而不仅仅是警告。
  • FWIW 直接回答问题,在 Jupyter 笔记本的单元格顶部添加 %%capture output 似乎对我有用。
【解决方案2】:

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

import warnings

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

with warnings.catch_warnings(record=True):
    action_with_warnings()

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

【讨论】:

    【解决方案3】:

    解决方案

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

    with warnings.catch_warnings():
        warnings.simplefilter('ignore')
        # Your problematic instruction(s) here
    

    如果有充分的理由保护整个单元格,那么只需通过插入capture "magic" 来防止 stderr 流显示在单元格输出区域中:

    `%%capture --no-stderr`
    

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


    解释

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

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

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

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

    Python 提供了warnings.simplefilter,其中:

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

    它注册了一些操作(ignore 表示无操作,always 用于打印警告消息等,请参阅full description)。

    例子:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-14
      • 2016-02-04
      • 2020-05-05
      • 2020-04-02
      • 1970-01-01
      • 1970-01-01
      • 2017-08-04
      • 2021-01-11
      相关资源
      最近更新 更多