やったこと
windowsのpythonで例外が上がった時だけ音を鳴らすようにしてみた。
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で実行結果受け取って分岐してもできそう?
call test.bat
if %errorlevel% == 1 (
echo test.batを実行した結果、戻り値として1が返った
)
参考:Cmd - DOS コマンド一覧 - Programming Field
参考:【bat】Windowsのバッチファイル(*.bat)の書き方自分用まとめ - Qiita
以上。