ファイル・フォルダを監視する必要がある方には、おススメの内容です。
Watchdogを使えば、手軽な履歴管理システムを作れます。
また、ファイル連携システムをWatchdogで簡単に作れそうです。
本記事の内容
- Watchdogとは?
- Watchdogのシステム要件
- Watchdogのインストール
- Watchdogの動作確認
それでは、上記に沿って解説していきます。
Watchdogとは?
Watchdogとは、ファイルシステムのイベントを監視するライブラリです。
「番犬」という名前の通りの機能となります。
Watchdogの使い方には、次の2つが用意されています。
- Python API
- コマンドラインツール
プログラムに組み込みたいなら、Python APIとしての利用になるでしょう。
私が過去に経験したプロジェクトでは、自動受注システムなどで使えそうです。
その自動受注システムは、CSVにて大量のデータが転送されてくる仕様でした。
データ転送には、FTP通信が利用されていました。
その際に、特定のフォルダを監視していたのです。
このようなケースにおいて、Watchdogが使えますね。
Watchdogを使えば、数分毎にそのフォルダを監視する仕組みを作る必要がないのです。
それもバッチではなく常時監視なので、ほぼタイムラグはありません。
コマンドラインツールは、調査・確認などでの利用が考えられます。
確認の例としては、ログなどのファイル出力チェックというケースで使えます。
システム更新時において、フォルダのパーミッションが適切かどうかを確認できます。
更新後にファイルがちゃんと吐かれるかを監視することがあります。
このようなケースで、コマンドラインツールとしてWatchdogを使えそうです。
以上、Watchdogについて利用シーンを加えながら説明しました。
次は、Watchdogのシステム要件を確認しましょう。
Watchdogのシステム要件
現時点(2021年4月9日)でのWatchdogの最新バージョンは、2.0.2となります。
この最新バージョンは、2021年1月22日にリリースされています。
サポートOSに関しては、以下を含むクロスプラットフォーム対応です。
- Windows
- macOS
- Linux
そして、サポート対象となるPythonのバージョンは以下。
- Python 3.6
- Python 3.7
- Python 3.8
- Python 3.9
Pythonの公式開発サイクルに準じています。
優等生のライブラリと言えます。
バージョン | リリース日 | サポート期限 |
3.6 | 2016年12月23日 | 2021年12月 |
3.7 | 2018年6月27日 | 2023年6月 |
3.8 | 2019年10月14日 | 2024年10月 |
3.9 | 2020年10月5日 | 2025年10月 |
上記より、Pythonのバージョンには注意です。
ちゃんと公式開発サイクルに従っていれば、何も問題はありません。
なお、私は現時点で最新のPythonで検証しています。
>python -V Python 3.9.4
WindowsにおけるPythonのアップグレードは、驚くぐらいに簡単です。
次の記事でPythonのアップグレードについてまとめています。
セキュリティやパフォーマンスのために、是非ともアップグレードはしておきましょう。
以上、Watchdogのシステム要件に関して説明しました。
次は、Watchdogをインストールしていきましょう。
Watchdogのインストール
最初に、現状のインストール済みパッケージを確認しておきます。
>pip list Package Version ---------- ------- pip 21.0.1 setuptools 54.2.0
次にするべきことは、pip自体の更新です。
pipコマンドを使う場合、常に以下のコマンドを実行しておきましょう。
python -m pip install --upgrade pip
では、Watchdogのインストールです。
Watchdogのインストールは、以下のコマンドとなります。
pip install watchdog
インストールは、一瞬に終わります。
では、どんなパッケージがインストールされたのかを確認しましょう。
>pip list Package Version ---------- ------- pip 21.0.1 setuptools 54.2.0 watchdog 2.0.2
Watchdog以外は、インストールされていません。
依存関係のあるパッケージは、ないということです。
これなら、インストールで問題になることは少ないでしょう。
容易に導入ができるということですね。
以上、Watchdogのインストールの説明でした。
最後は、Watchdogの動作確認を行います。
Watchdogの動作確認
Watchdogには、以下の二つの利用方法がありました。
- Python API
- コマンドラインツール
それぞれを以下で説明します。
Python API
引数に渡されたディレクトリを監視するプログラムです。
発生したイベントをログに記録していきます。
test.py
import sys import time import logging from watchdog.observers import Observer from watchdog.events import LoggingEventHandler if __name__ == "__main__": logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S') path = sys.argv[1] if len(sys.argv) > 1 else '.' event_handler = LoggingEventHandler() observer = Observer() observer.schedule(event_handler, path, recursive=True) observer.start() try: while True: time.sleep(1) finally: observer.stop() observer.join()
監視対象となるフォルダを用意しましょう。
ここでは、test.pyと同じ階層にtempフォルダを作成します。
ここまで用意できたら、プログラムを起動します。
>test.py temp
上記を実行すると、Watchdogによる監視が始まります。
ここから、tempフォルダ以下で次の作業を行います。
- ファイル作成
- ファイル編集
- ファイル削除
上記作業を行うとtest.pyを実行したターミナルでは、以下のように表示されます。
>test.py temp 2021-04-09 10:50:59 - Created file: temp\file.txt 2021-04-09 10:51:10 - Created file: temp\file.txt~ 2021-04-09 10:51:10 - Modified file: temp\file.txt~ 2021-04-09 10:51:10 - Modified file: temp\file.txt 2021-04-09 10:51:10 - Modified file: temp\file.txt 2021-04-09 10:51:10 - Modified file: temp\file.txt 2021-04-09 10:51:10 - Deleted file: temp\file.txt~ 2021-04-09 10:51:18 - Deleted file: temp\file.txt
イベントを監視できているようです。
動作確認としては、これで十分ですね。
コマンドラインツール
watchmedoというツールが、インストールされています。
このツールを利用します。
ただし、watchmedoを動かすために必要なライブラリがあります。
PyYAMLとarghが必要となります。
インストールは、以下のコマンドで可能です。
pip install PyYAML pip install argh
上記をインストールして確認します。
>pip list Package Version ---------- ------- argh 0.26.2 pip 21.0.1 PyYAML 5.4.1 setuptools 54.2.0 watchdog 2.0.2
パッケージが揃ったら、次のコマンドで確認しましょう。
>watchmedo --help
watchmedoのヘルプが表示されれば、準備OKです。
では、watchmedoを使ってファイルイベントの監視を行います。
>watchmedo log --patterns="*.py" --ignore-directories --recursive .
上記コマンドは、pyファイルのみのイベントを監視してログに出力します。
フォルダ(ディレクトリ)は、無視するというオプションを付けています。
「– recursive」は、再帰的に監視するということです。
つまり、今いる場所「.」以下のすべてのフォルダにあるpyファイルを監視します。
test.pyを変更してみます。
そうすると、以下のようにログが表示されます。
>watchmedo log --patterns="*.py" --ignore-directories --recursive . on_modified(self=<watchdog.tricks.LoggerTrick object at 0x0000027962E2BCD0>, event=<FileModifiedEvent: event_type=modified, src_path='.\\test.py', is_directory=False>) on_modified(self=<watchdog.tricks.LoggerTrick object at 0x0000027962E2BCD0>, event=<FileModifiedEvent: event_type=modified, src_path='.\\test.py', is_directory=False>) on_modified(self=<watchdog.tricks.LoggerTrick object at 0x0000027962E2BCD0>, event=<FileModifiedEvent: event_type=modified, src_path='.\\test.py', is_directory=False>)
watchmedoでも、監視ができていることが確認できました。