有时会发生错误,但我没有注意到,因为我可能同时运行多个单元格。
我希望通过错误来播放声音。换句话说,当执行失败、引发异常、发现执行错误等时,播放声音。
许多人希望长时间运行的细胞在完成后播放声音。
COLAB
我混合了我在一些地方找到的解决方案1 2 3 4
a( 创建一个全局异常处理程序,在错误时发出蜂鸣声
b( 创建一个简单的函数,放置在长时间运行的单元格的末尾(链接上的一些其他方法(
你可以把声音改成你喜欢的任何声音。
注意:异常处理程序和beep_completed((内部的声音非常不同,这是有原因的。第一个是简短而不烦人的,第二个是冗长而愉快的(以防你不在电脑旁,所以你清楚地听到任务已经完成(。在任何情况下,您都可以更换它们。
注:有一行仅适用于Colab。如果你能为Jupyter提供一个,我很乐意更新答案。
# This line is specific for Colab (please provide alternative for Jupyter)
from google.colab import output
from IPython.core.ultratb import AutoFormattedTB
# Catch any Exception, play error sound and re-raise the Exception
#-------------------------------------------------
# initialize the formatter for making the tracebacks into strings
itb = AutoFormattedTB(mode = 'Plain', tb_offset = 1)
# this function will be called on exceptions in any cell
def custom_exc(shell, etype, evalue, tb, tb_offset=None):
# still show the error within the notebook, don't just swallow it
shell.showtraceback((etype, evalue, tb), tb_offset=tb_offset)
# Play an audio beep. Any audio URL will do.
output.eval_js('new Audio("http://soundbible.com/grab.php?id=419&type=wav").play()')
# # grab the traceback and make it into a list of strings
# stb = itb.structured_traceback(etype, evalue, tb)
# sstb = itb.stb2text(stb)
# print (sstb) # <--- this is the variable with the traceback string
# print ("sending mail")
# send_mail_to_myself(sstb)
# this registers a custom exception handler for the whole current notebook
get_ipython().set_custom_exc((Exception,), custom_exc)
#------------------------------------------
# Function to play a sound (to put at the end of a long job)
def beep_completed():
#url_sound="http://soundbible.com/grab.php?id=1795&type=mp3";
output.eval_js('new Audio("http://soundbible.com/grab.php?id=1795&type=mp3").play()')
# Just play it with
beep_completed()
Jupyter
根据需要进行注释。如果你想使用本地文件,你必须先下载它,然后调整路径。
from IPython.display import Audio, display
# ----- error sound --------
def play_sound_error(self, etype, value, tb, tb_offset=None):
self.showtraceback((etype, value, tb), tb_offset=tb_offset)
v1="http://soundbible.com/grab.php?id=419&type=wav" # Short Error Beep sound
v2="https://wav-sounds.com/wp-content/uploads/2017/09/Various-02.wav" # Short Baby cry
display(Audio(url=v1, autoplay=True))
v1="../sound_error_beep.wav" # Short Error Beep sound
v2="../sound_baby_cry.wav" # Short Baby cry
display(Audio(filename=v1, autoplay=True))
# ----- atach it to all Exceptions
get_ipython().set_custom_exc((Exception,), play_sound_error)
# ----- success sound --------
def play_sound_success():
v1='http://soundbible.com/grab.php?id=1795&type=wav'
#display(Audio(url=v1, autoplay=True))
display(Audio(filename='../sound_success.wav', autoplay=True))
因为在我的用例中,set_custom_exc
解决方案是不可接受的,因为它确实覆盖了以前建立的自定义异常,所以我创建了一个小型通知包,既适用于常规脚本(使用sys.excepthook
(,也适用于jupyter笔记本(使用post_run_cell
(。
此外,由于我不喜欢单元格立即崩溃时出现叮当声的情况,我添加了一个基于总执行时间(在脚本中时(或单元格执行时间(笔记本中时(的可自定义最小时间间隔。
该包同时作为进口oneliner提供,如:
import ringbell.auto
如果执行时间超过一分钟,它将播放声音。
或立即通知:
import ringbell.immediate
或者,对于仅针对异常的通知:
import ringbell.all_exceptions
您也可以随时使用它来播放声音,方法是导入RingBell
类并转到:
from ringbell import RingBell
RingBell(
sample = "microwave",
minimum_execution_time = 0,
verbose = True
)
你可以通过运行:从PyPi获得它
pip install ringbell