Pythonの処理完了をいろんな方法で通知する
Pythonで重たい処理をかけると30分-2時間ほど待つことがあります。 作業の待ち時間では他の細々した作業を片付けたりインターネットに潜ったりしますが、気がつくと30分前に処理は終わってて無駄に時間を潰してしまうことも多々。何かしら処理完了の通知が飛んでくればそんな無駄な時間は生まれません。なので通知を飛ばしましょう。
環境はWindows10(version 1809)です。AnacondaでPython環境を構築して、そこからjupyter notebookやjupyter labを呼び出しています。 で、以下の3つの方法で通知を飛ばします。
- 音(Beep音)
- Slack通知
- トースト通知
jupyter notebook(ipython全般)では先頭にエクスクラメーションマーク(!)をつけることでコマンドプロンプトのコマンドを打ち込むことが出来ます。上記3つとも、Windowsのコマンドを呼び出して通知を行います。
音(Beep音)で通知する
コマンドプロンプト上で以下の文字列を入力すると聞き慣れたBeep音を鳴らすことが出来ます。
rundll32 user32.dll,MessageBeep
これをjupyter notebookで呼び出してあげるだけ。以下は5秒後にBeep音が鳴るサンプルです。
import time for i in range(5): print(i) time.sleep(1) !rundll32 user32.dll,MessageBeep
音が鳴るのを実証するために動画も撮りました。音量を若干上げて閲覧してみてください。
このやり方はWindows7以降であれば使えます。Pythonは標準ライブラリにwinsoundというやつがあって、これを使っても似たようなことができます。
Beep音は他の通知と区別がつかないため、独特の音を鳴らして区別したい場合にはwinsoundを使ったほうが良いかもしれません。
import winsound winsound.Beep(2000, 500)
Slackで通知を飛ばす
音が出せない場合にはSlackで通知を飛ばすと便利です。WebからSlackにログインし、Imcoming Webhookの設定を呼び出します。
自分だけに通知が飛べばいいので上記のチャンネルを指定。
ここに記載のあるURLをコピーしておきます。
Windows 10にはcurlが入ってるので、これを使って上記URLに投稿したい内容を送ります。
curl -X POST --data-urlencode "payload={\"text\": \"Process END\" }" https://hooks.slack.com/services/TAAAAAAAA/BBBBBBBBBB/ZZZZZZZZZZZZZZZZZZZZZ
Beep音を鳴らしたときのように、エクスクラメーション(!)の後にcurl + TEXT + URLを書いてやれば処理完了後にSlackに通知が飛んできます。
Windows10のトースト通知を使う
トースト通知はメールやSlackに新規メッセージが来たときに右下で開く四角い枠のことです。つまりは上のSlack通知で出てきてる小窓です。
このトースト通知、コマンドプロンプトから直接呼び出そうとすると面倒なのでpowershellを使います。
Add-Type -AssemblyName System.Windows.Forms $toast = New-Object System.Windows.Forms.NotifyIcon $toast.Icon = [System.Drawing.Icon]::ExtractAssociatedIcon('C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe') $toast.BalloonTipTitle = 'ENDCall' $toast.BalloonTipText = 'Process END' $toast.Visible = $True $toast.ShowBalloonTip(1000)
Windows PowerShellを呼び出して上のコードを入力すると通知が飛んできます。
ただし、jupyter notebookの ! ではpowershellを直接呼び出せないので、コマンドプロンプトからpowershellを呼び出してトースト通知を行います。コマンドプロンプトからpowershellを呼び出すには powershell -Command "hoge"でいけるので
powershell -Command "Add-Type -AssemblyName System.Windows.Forms; $toast = New-Object System.Windows.Forms.NotifyIcon; $toast.Icon = [System.Drawing.Icon]::ExtractAssociatedIcon('C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe'); $toast.BalloonTipTitle = 'ENDCall'; $toast.BalloonTipText = 'Process END'; $toast.Visible = $True; $toast.ShowBalloonTip(1000)"
これをPython処理後に ! 付きで呼び出せば処理が終わったときにトースト通知をしてくれます。
検証しておいてなんですが、powershellで通知飛ばすくらいならおとなしくSlack使ったほうが楽です。こういう細々したテクニックを上手く使って無駄な時間を減らしていきたいですね。