我在python 3 jupyter笔记本中得到了一些无用的警告。我想仅在特定单元格中关闭这些警告,而不是在ipynb文件的其余部分中。 有人知道怎么做吗?
答案 0 :(得分:13)
将%%capture
写为单元格的第一行以捕获单元格输出。您可以使用选项--no-stderr, - no-stdout, - no-display和--output来控制将捕获的单元格输出。查看更多详情here.
答案 1 :(得分:1)
通常我想保持标准输出打开以便打印,所以我发现使用catch_warnings
更好:
import warnings
def action_with_warnings():
warnings.warn("should not appear")
with warnings.catch_warnings(record=True):
action_with_warnings()
它的缺点是将警告存储在内存中,但是通常不会产生很大的开销,并且值得简化。即使在单个单元中,我也会发现细粒度的控制意味着我确实关心的警告不会被意外遗漏。
答案 2 :(得分:1)
解决方案:
通常不需要将效果扩展到整个单元格,因为这可能会隐藏一些其他有用的消息,因此请使用上下文管理器忽略警告:
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
。如果 record
为 True
,则列表为
返回的对象逐渐填充,如所见
自定义 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)
答案 3 :(得分:-1)
如果您想查看 matplotlib 图形,但不想出现错误(例如,除以零),请将其放在单元格的顶部对我有用:
%%capture --no-display