LoginSignup
4
3

More than 5 years have passed since last update.

windowsのGUIからpython呼び出す時のエラー通知方法というかwinsound.Beep

Last updated at Posted at 2016-09-25

やったこと

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

test_alert.py

import winsound

def hoge():
    # 何か例外が起きる

if __name__ == '__main__':
    try:
        hoge()
    except:
        winsound.Beep(400, 200)

仕組みとしては、35.4. winsound — Windows 用の音声再生インタフェースから、例外が発生した時に400Hzで200msの音を鳴らしてるだけ。
(追加pip installとかもいらなかったので便利)

経緯

windowsでエクスプローラーなどGUIから、.batよろしくpythonのスクリプトファイルを単発で起動することがある。
その時、実行時だけはシェルウインドウが開いて標準出力が表示され、処理が終わったら閉じたりする。

問題として、スクリプトが異常終了した時もシェルウィンドウは閉じてしまい、標準エラー出力などが見れない。
(エラーは表示されるけど即シェルウィンドウは閉じてしまう)
すると、正常終了なのか、異常終了なのかがわからない。

私は以下な感じでTablacus Exporerからpythonスクリプトを直に呼び出してたりするので、この問題に出くわした。
Tablacus Explorerで選択したアイテムをJScriptからpythonに渡して一括リネーム - Qiita

何がいいのか? というかやりたかったこと

そもそもは、

  • シェルウインドウはpythonスクリプト実行したら閉じて欲しい(毎度閉じるのがめんどうなので、)
  • が、異常終了時はシェルウィンドウが閉じずにエラー出力を表示したままにして欲しい(前述のように異常終了がわからないので)

ただ、あれこれ調べて実装が1番簡単なのがよかったけど、

  • カッコいい例外処理書いてCUIからGUI操作したくないし、(そこまでちゃんとしてる必要もないものだった)
  • logファイルも吐きたくないし、(ローテートめんどいし、そもそもほとんど見ないし)
  • .batをいじいじするのもやだし、(追加でもう一枚スクリプトかますのはちょっと...)

で、この仕組に辿りついた。

これだと音がなったらなんか問題あるな?とわかるので、あとはIDEなり開いて好きにデバックすればいいなと。

(おまけ) もしcmd.exe経由でスクリプトを実行してたら

$ python hoge.py || rundll32 user32.dll,MessageBeep

windowsもlinuxよろしく、実行結果でパイプできるんだなと。

参考:Pythonでビープ音を鳴らす(Windowsのみ) - 数値計算とかの備忘録(仮)

あるいは、/kつけてシェル窓起動して、.batで実行結果受け取って分岐してもできそう?

test.bat
call test.bat
if %errorlevel% == 1 (
    echo test.batを実行した結果、戻り値として1が返った
)

参考:Cmd - DOS コマンド一覧 - Programming Field
参考:【bat】Windowsのバッチファイル(*.bat)の書き方自分用まとめ - Qiita

以上。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3