

「VSCodeのターミナルでプログラムの実行中にエラーが発生した際、通知音を鳴らす」という設定をすることは可能でしょうか。

（例：PythonでSeleniumを動かしている際にselenium.common.exceptions.WebDriverExceptionエラーが発生した際に、通知音を鳴らす）

Seleniumによる自動作業をさせているのですが、時々エラーが生じた際にそれに気づくことが遅れるため、その解決のためこの質問をさせていただいてます。見える所にターミナル置いて気づけ等は無しでお願いします。

環境：Windows 10


CC BY-SA 4.0
2020-04-25T21:50:27.530
65966
2020-04-27T00:56:25.550
2020-04-27T00:56:25.550
19110
39812
question
vscode
VSCodeのターミナルでエラー時に通知音を設定するには？


この場合「VSCodeのターミナル」は単に「Seleniumを動かしている」Pythonプログラムを起動しているだけで特に連携している訳ではないのでは？

つまり、「VSCodeのターミナル」が「Pythonプログラムの動作を監視して何かアクションする」とか、「Pythonプログラム」が「VSCodeのターミナルへ何か通知してアクションを取ってもらう」といったことでは無く、「Seleniumを動かしているPythonプログラムが例外発生時に単独でエラー音を鳴らす」だけで良いと思われます。

そうした場合にこの記事が応用できるのではないでしょうか？  
[windowsのGUIからpython呼び出す時のエラー通知方法というかwinsound.Beep](https://qiita.com/noexpect/items/382ee6bdb3b718aa838a)

> windowsのpythonで例外が上がった時だけ音を鳴らすようにしてみた。
[code]

>     import winsound
>  
>     def hoge():
>         # 何か例外が起きる
>  
>     if __name__ == '__main__':
>         try:
>             hoge()
>         except:
>             winsound.Beep(400, 200)
>  
[/code]

>
> **経緯**  
>
> windowsでエクスプローラーなどGUIから、.batよろしくpythonのスクリプトファイルを単発で起動することがある。その時、実行時だけはシェルウインドウが開いて標準出力が表示され、処理が終わったら閉じたりする。  
>
> 問題として、スクリプトが異常終了した時もシェルウィンドウは閉じてしまい、標準エラー出力などが見れない。(エラーは表示されるけど即シェルウィンドウは閉じてしまう)  
>  すると、正常終了なのか、異常終了なのかがわからない。  
>  私は以下な感じでTablacus Exporerからpythonスクリプトを直に呼び出してたりするので、この問題に出くわした。
>
> **何がいいのか? というかやりたかったこと**
>
> これだと音がなったらなんか問題あるな?とわかるので、あとはIDEなり開いて好きにデバックすればいいなと。

**追記：**

コメントでは`winsound.Beep()`では鳴らなかったが、以下記事を基に`winsound.PlaySound()`を使えば出来たようです。`wav`ファイルを用意して任意の音を鳴らせたとか。  
[Pythonのwinsoundで音楽再生する方法を現役エンジニアが解説【初心者向け】](https://techacademy.jp/magazine/20870)

> カレントディレクトリに音声ファイル`sample.wav`があるものとします。
[code]

>     import winsound
>  
>     with open('sample.wav', 'rb') as f:
>         data = f.read()
>  
>     winsound.PlaySound(data, winsound.SND_MEMORY)
>  
[/code]

上記が出来るなら、システムで用意されている`wav`ファイルを使用する`winsound.MessageBeep()`が使えるかもしれません。  
[winsound.MessageBeep（type = MB_OK
）](https://docs.python.org/3.9/library/winsound.html#winsound.MessageBeep)  
元のAPIとパラメータはこちら [MessageBeep function](https://docs.microsoft.com/en-
us/windows/win32/api/winuser/nf-winuser-messagebeep)

他にはエスケープシーケンス`\a`によるアラート音の鳴動があるようです。  
ただしIDEの中だと駄目だったりするようですが。  
[Play simple beep with python without external
library](https://stackoverflow.com/q/4467240/9014308)

> So `sys.stdout.write("\a")` might be better.

[How to make a sound in OSX using python
3](https://stackoverflow.com/q/42150309/9014308)

>
[code]

>     import sys
>     sys.stdout.write('\a')
>     sys.stdout.flush()
>  
[/code]

>
> Acutually,`sys.stdout.write('\a')` works for me,but not in IDE,try to run
> this code in **Terminal**.You will hear the system sound.  
>  実際には`sys.stdout.write('\a')`機能しますが、IDE では機能しません。このコードを **ターミナル**
> で実行してみてください。システムサウンドが聞こえます。

* * *

Windows以外だと、この辺の記事の内容で置き換えれば出来るでしょう。  
[[Python] ビープ音を鳴らす（Windows/Mac対応）](https://www.yoheim.net/blog.php?q=20180313)

> ビープ音はWindowsとMacでそれぞれ実現方式が違うので、`platform.system()`で環境別に実装します。
[code]

>     def beep(freq, dur=100):
>         """
>             ビープ音を鳴らす.
>             @param freq 周波数
>             @param dur  継続時間（ms）
>         """
>         if platform.system() == "Windows":
>             # Windowsの場合は、winsoundというPython標準ライブラリを使います.
>             import winsound
>             winsound.Beep(freq, dur)
>         else:
>             # Macの場合には、Macに標準インストールされたplayコマンドを使います.
>             import os
>             os.system('play -n synth %s sin %s' % (dur/1000, freq))
>  
>     // 2000Hzで500ms秒鳴らす
>     beep(2000, 500)
>  
[/code]

実は`play`はMacOSの`SoX`というパッケージに入っているようです。  
下記Linux系記事のコメントに以下のようにあります。

> On MacOS you can install sox via ports (sudo port install sox). Sox contain
> the play command.  
>  MacOSでは、ポートを介してsoxをインストールできます（sudo port install
> sox）。Soxには、playコマンドが含まれています。

Linux系でも使えるかもしれません。  
[play(1) - Linux man page](https://linux.die.net/man/1/play)

[Python: what are the nearest Linux and OSX equivalents of
winsound.Beep?](https://stackoverflow.com/q/12354586/9014308)

> However, you can try the os.system command to do the same with the system
> command
> [beep](https://www.chiark.greenend.org.uk/~sgtatham/utils/beep.html). Here
> is a snippet, which defines the function playsound in a platform independent
> way  
>
> ただし、os.systemコマンドを試して、システムコマンドbeepで同じことを行うことができます。これは、プラットフォームに依存しない方法で関数playsoundを定義するスニペットです
[code]

>     try:
>         import winsound
>     except ImportError:
>         import os
>         def playsound(frequency,duration):
>             #apt-get install beep
>             os.system('beep -f %s -l %s' % (frequency,duration))
>     else:
>         def playsound(frequency,duration):
>             winsound.Beep(frequency,duration)
>  
[/code]

Linux系の記事です。MacOS同様、`beep`もインストールする必要があるかもしれません。

> You will need to install the beep package on linux to run the beep command.
> You can install by giving the command  
>  ビープコマンドを実行するには、ビープパッケージをLinuxにインストールする必要があります。コマンドを与えることでインストールできます
[code]

>     sudo apt-get install beep
>  
[/code]


CC BY-SA 4.0
2020-04-26T02:32:21.933
65971
2020-04-27T00:12:59.547
2020-04-27T00:12:59.547
26370
26370
65966
answer