ライブラリ: watchdog

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 など短期間では廃りにくい方法をひとつ知っておくと便利だと思います。

参考