Posted at

Watchdogを使ってみた

Pythonでファイルの変更を監視するためのクラスとして、Watchdogというクラスがあります。

Qiitaにもほかにも記事がありますので、使うのに困ることはあまりないと思います。

ただいちおう使用するにあたって躓いたところがあるのでいちおうそこだけメモ。


Watchdogで監視できるのは、フォルダのみ

Watchdogは他の方が書かれているサンプルにもあるとおり、watchdog.observers.Observerオブジェクトを使ってファイルを監視します。

    self.observer = Observer()

self.observer.schedule(ChangeHandler(), dir)
self.observer.start()

ただ、Observer#schedule()に指定できるのは「フォルダのパスのみ」です。ファイルパスを指定することはできません。

特定のファイルだけ監視したいときは、親フォルダを監視した上で、ファイル名で照合をしましょう。

class ChangeHandler(FileSystemEventHandler):

"""
Event handlers for watchdog.
"""

def __init__(self, owner):
self.owner = owner

def on_modified(self, event):
p = Path(event.src_path)
if p == self.owner._review_file or p.suffix in [".js", ".css"]:
self.owner.show_review()


フォルダのパスは「文字列で」指定する

引数には文字列しか指定することはできません。なんだかんだこのようにパスを指定する場面で指定できることの多いpathlib.Path型を指定することはできません。かならずstr()関数などで文字列化してから指定する必要があります。


監視をやめたいときは

監視をやめるときは、Observer#stop()Observer#join()を呼びます。

      self.observer.stop()

self.observer.join()