当 Jupyter 笔记本单元出现故障时播放声音

Posted

技术标签:

【中文标题】当 Jupyter 笔记本单元出现故障时播放声音【英文标题】:play sound when Jupyter notebook cell fails 【发布时间】:2016-11-21 14:23:40 【问题描述】:

有什么技巧可以在 Jupyter 笔记本单元抛出错误时播放声音

我检查了this question,我目前正在像这样使用cellbell:

import cellbell

# line magic
%ding my_long_function()

但我不知道在我的一个单元格抛出错误时让它运行(除了将每个单元格包装在 try/catch 子句中)。

我想我需要的是类似“错误钩子”的东西,类似于savehook...

【问题讨论】:

【参考方案1】:

没有cellbell(更通用的答案)

在您的笔记本中定义一个函数。 **注意:Audio 必须传递给display

from IPython.display import Audio, display

def play_sound(self, etype, value, tb, tb_offset=None):
    self.showtraceback((etype, value, tb), tb_offset=tb_offset)
    display(Audio(url='http://www.wav-sounds.com/movie/austinpowers.wav', autoplay=True))

设置自定义异常处理程序,可以在元组中列出异常类型。

get_ipython().set_custom_exc((ZeroDivisionError,), play_sound)

测试一下:

1/0

---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
<ipython-input-21-05c9758a9c21> in <module>()
----> 1 1/0

ZeroDivisionError: division by zero

cellbell: 不同之处在于使用%ding 魔法。

import cellbell

def play_sound(self, etype, value, tb, tb_offset=None):
    %ding
    self.showtraceback((etype, value, tb), tb_offset=tb_offset)
    print('ding worked!')

重置自定义异常,注意你可以使用Exception在任何错误时播放声音:

get_ipython().set_custom_exc((Exception,), play_sound)

测试:

1/0

---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
<ipython-input-4-05c9758a9c21> in <module>()
----> 1 1/0

ZeroDivisionError: division by zero

ding worked!

在 jupyter notebook 4.2.3 上测试

【讨论】:

以上是关于当 Jupyter 笔记本单元出现故障时播放声音的主要内容,如果未能解决你的问题,请参考以下文章

联想笔记本插入耳机没声音,如何解决?

Jupyter笔记本没有执行单元格?

在jupyter中播放音频,在for循环中

笔记本为啥没有声音了

如何播放特定频率和框架的声音未找到音频单元问题

使用 IPython.display.audio 在 jupyter notebook 中播放音频在函数内使用时不起作用