python watchdog動作について

<h1> 概要 </h1>
pythonでファイル変更などの監視用途としてマルチプラットフォームで動作するという [watchdog](https://pythonhosted.org/watchdog/index.html) モジュールを利用しようと考え、動作確認を行った際のメモです。

<h1> 結論 </h1>
結論ですが、ファイル作成の挙動がmacとそれ以外で異なったというだけの報告となります。

<h1> 確認内容 </h1>

<h2> とりあえず準備 </h2>

```bash
$ pip install watchdog
```
簡単ですね、これでwatchdogを入れるだけです。

<h2> 確認したコード </h2>

単に所定のディレクトリにあるテキストを監視するというモノです。

```python
#!/usr/bin/env python                                                                                                 
# coding=utf8                                                                                                         
                                                                                                                      
from watchdog.observers import Observer                                                                               
from watchdog.events import PatternMatchingEventHandler                                                               
import sys                                                                                                            
import os                                                                                                             
import time                                                                                                           
                                                                                                                      
class TextFileEventHandler(PatternMatchingEventHandler):
        def __init__(self, patterns=['*.txt', '*.text', '*.doc', '*.md'], ignore_patterns=None,
                                 ignore_directories=True, case_sensitive=False):
                super().__init__(patterns, ignore_patterns, ignore_directories, case_sensitive)

        def on_any_event(self, event):
                print(event)
                print(event.event_type)

if __name__ == "__main__":
        wdir = os.path.abspath(sys.argv[1])
        print("watch dir: ", wdir)
        evh = TextFileEventHandler()
        obs = Observer()
        obs.schedule(evh, wdir, recursive=True)
        print("watching..")
        obs.start()

        try:
                while True:
                        time.sleep(1)
        except KeyboardInterrupt:
                obs.unschedule_all()
                print("finishing..")           
                obs.stop() 
        obs.join() 

        print("end watch.")

```

<h2> macでの動作確認 </h2>

```bash
$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.13.6
BuildVersion:   17G7024
```
![watcher.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16828/09ea62a1-43d4-3862-c03c-4de839ebeb83.gif)

とりあえず、動作結果は上記の通りですが、結論に書いた部分として、ファイル作成時にmacではどうなったかについて記載します。

touch document/aa.txt
とすると、
createdイベントだけ生成されています。

<h2> debianでの動作確認 </h2>
debianというかdockerのpythonイメージ公式を利用しました。手順としては以下のような感じなので、サクッと確認できると思います。

```bash
$ cd test
$ ls 
watch.py
$ md document
$ docker run -it -v `pwd`:/opt /bin/bash
# pip install watchgog
# cd /opt
# python watch.py document
```

こちらも動作イメージをぺたり
![watcher_debian.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16828/380d96e3-ee75-2ad8-7bd3-a048e6bd605b.gif)

windows10でも確認しましたが、動きとしてはdebianと同じでした。

touch document/aa.txt
とした際に、
created
modified
となる

<h1> あとがき</h1>
内容的に何というほどのこともありませんが、macの動きの方が好きですw
とはいえ、マルチプラットフォームで動作させようとした場合には、同じ動作になっていた方が好ましいので、微妙な結果ですね。
まぁ、バックエンドで動いているものに依存するのでしょう。

現状5種類あるようですが、今回の環境では、mac：FSEventsObserver、debian：InotifyObserver、windows：WindowsApiObserver という感じです。obsを生成して、print(obs)を見るとわかります。
動作を変えたいのであれば、このObserverを自前で実装すれば良いとのこと。

https://pythonhosted.org/watchdog/api.html?highlight=observe#module-watchdog.observers