Pythonのメソッドにデコレータをつけるだけで、その処理が終わったらSlackやメールや画面のポップアップで通知してくれるツールを作りました。
正直そんなに大したツールではないんだけど、 こういう時間のかかる試行錯誤をサポートしてくれるツールを便利だと思ってくれる人が他にもいたらうれしいな、と思うのでブログに書いてみます!
作った背景とコンセプト
わたしは普段、機械学習や、大量データに対するデータ処理や分析をやっています。 いつも時間がかかるスクリプトを回しながら他の仕事をして、定期的にスクリプトが終わったか確認するということをしていたのですが、 これが面倒なので、処理が終わったら通知してくれると便利だなと思ったのが作るきっかけです。
ちなみに、kerasやtensorflow、chainerなどを使う場合だと、以下のツールがあります。
Hyperdash | Machine Learning Monitoring
Hyperdashは、フレームワークからメタデータを取得してスマ―トフォンで機械学習の詳細な進捗具合を見ることができるなど多機能です。 これはすごく便利なのですが、限られディープラーニングフレームワークでしか使えません。 また、利用するフレームワークによって実装方法が異なり使い方が少し複雑です。
わたしはディープラーニング以外に、PySparkを使った分析や、SQLAlchemyを使ってRedShiftに接続してPythonからSQLを実行するということをやることも多いです。 なので、いろいろな場面で使いやすいものがほしいと思い、
- 汎用的に使えてかつ使い方が簡単
- 終わったら通知するだけのシンプルな仕様
をコンセプトとして作りました。
使い方
使い方はめっちゃ簡単で、pipでインストールして、configファイルに数行の設定を書いて、処理が終わったら通知してほしいメソッドの上にデコレータをかくだけです。
インストール
pip install easy_notifier
デコレータの記述
@easy_notifier(~/.easy_notifier.cfg) def test_method() ・・・ 処理の中身 ・・・ test_method()
通知の結果はこんなかんじです。
Slackでの通知
メールでの通知
macのポップアップでの通知
通知の中のreturnはreturn valueで、返り値を表示します。 今見るとわかりにくいのであとで修正しておこう。。。
設定ファイルの中身はこういう感じです。 必要なところだけ埋めて使います。
[easy_notifier] env = ec2 process_name = test_process notify_slack = true notify_gmail = true notify_mac = false incoming_webhook_url = 'https://slack/testurl' slack_id = my_slack_id channel = my_slack_channel from_address = test@gmail.com from_password = password to_address = test2@xxx.com
以下は各パラメータの説明です。
パラメータ | 説明 |
---|---|
env | 上の通知のinstance_nameの取得方法で、ec2、local、gceのいずれかを指定します。EC2の場合はNameタグをinstance_nameとして利用します。localの場合はhostnameがinatance_nameとなります。gceはまだ実装していなくて、hostnameがinstance_nameとなります。 |
process_name | 上の通知のprocess_nameの表示内容を指定します。何も指定しない場合は、デコレータをセットした対象のメソッド名が利用されます。 |
notify_[slack|mac|gmail] | それぞれ、slack、macのポップアップ、gmailからのメール通知を使うかどうかを設定します。trueもしくはyesの場合、その通知方法での通知が行われます。macのポップアップでの通知をLinuxやWindows上で指定した場合は無視されます。 |
incoming_webhook_url | slackでの通知を行う場合は、slack上で通知を受け取るためにincoming_webhookの設定を行い、そのURLをこのパラメータに設定する必要があります。 |
slack_id | ここに、slackのDisplay nameを設定すると、その人にメンションされます。 |
channel | slackで通知してほしいチャンネルを設定します。 |
from_[address|password] | gmailからのメール通知を行う際の通知元のgmailアドレスとパスワードを設定します。 |
to_address | 通知先の任意のメールアドレスを指定します。 |
あとTODOとして、jupyter notebookのマジックコマンドでも同じことできるようなの作ったら便利かなと思っています。 以上です。 もし使ってやってもいいよという人がいたら、感想とか教えてもらえたらとてもうれしいです!