Python のライブラリである watchdog をご紹介してみます。
今回は次の組み合わせで動作確認をしています。
python 3.6.1
watchmedo 0.8.3
watchdog とは
watchdog とはファイルの変更を監視して、ファイルが変更されたら何らかの処理を行う自動化ツール作成のためのライブラリです。
watchdog を import してスクリプトを書く方法と、 watchmedo
というコマンドを利用する方法の 2 つの利用方法が用意されています。
私はライトな使い方しかしておらず「コマンドを使用する方法」だけで事足りてしまっているので、今回は後者のみの紹介とさせていただきます。スクリプトを書く方法に興味のある方は公式のドキュメントをご覧になってみてください。
インストール
pip でそのままインストールしましょう。
$ pip install watchdog
基本的な使い方
上述のとおり、今回は watchdog が提供するコマンド watchmedo
を使った方法をご紹介します。
といっても使い方はシンプルで、 watchmedo
コマンドに監視対象と実行したいコマンドをオプションでただ渡すだけで OK です。
以下は私が PHP のプロジェクトで PHPUnit のテストを書いている最中に使ったコマンドです。 PHPUnit のテストファイルが更新されたら(私がファイルを保存したら)自動で対象のテストファイルに対してテストを実行するというものです。
watchmedo shell-command \
--patterns="*Test.php" \
--ignore-directories \
--recursive \
--command='./vendor/bin/phpunit ${watch_src_path} && echo ""'
watchmedo にサブコマンド shell-command
を指定して実行しています。使用しているオプションについて以下にかんたんに説明します。
--patterns
対象のファイル名のパターン。--ingore-directories
ディレクトリを無視する場合につける。--recursive
再帰的に子孫ディレクトリをウォッチする場合につける。--command
ファイルの変更が検出されたときに実行したいコマンド。
私がいま確認したところ、公式のドキュメントには詳しい記述がありませんが、 --command
オプションで指定するコマンドの中では以下のパラメータを利用することができます。
${watch_src_path} 変更されたファイルのパス
${watch_dest_path} ファイル移動が発生するイベントにおいて移動先のファイルのパス
${watch_event_type} イベントのタイプ
${watch_object} ファイルかディレクトリか
以上です。
このあたりについては Node.js まわりでの開発が最近活発ですが Node.js は流行り廃りのサイクルが他の言語に比べて短いような気もするので、この Python の watchdog など短期間では廃りにくい方法をひとつ知っておくと便利だと思います。
参考