Python watchdog でファイル監視して自動処理

仕事の関係でテキストファイルを html ファイルに変換する処理を日常的に繰り返していて、Python で書いた変換するスクリプトを毎分実行するということをやっていました。その目的としてはそれで事足りていたのですが、別件でもファイルの更新を検知して処理したいなーと思っていたものがあり、たまたま Qiita で watchdog の使用例を書いた記事を見つけたのでやってみることにしました。

会社で使っている Python のスクリプトを全部(といってもそんなに数はないですが)3.x 系で統一しようと思っているので 3.x 系の virtualenv 環境でインストールしたところエラーになりました。下記のような参考になりそうな情報もあったのですが、私の環境ではうまくいかなかったので 2.x 系の環境に入れました。

基本的に Qiita の記事および公式ドキュメントのサンプルそのままです。ChnageHandler というクラスの中で on_modified とか on_created などのメソッドを定義してそこに処理を書きます。下記のコードだとこのスクリプトを置いているディレクトリにある something.txt についての modified イベントが発生すると、convert2.py を実行して、現在時刻を含んだメッセージを表示するようになっています。

import datetime
import os
import time

from watchdog.events import FileSystemEventHandler
from watchdog.observers import Observer

BASEDIR = os.path.abspath(os.path.dirname(__file__))


class ChangeHandler(FileSystemEventHandler):
    def on_modified(self, event):
        if event.is_directory:
            return
        if os.path.basename(event.src_path) == 'something.txt':
            os.system('C:\Python33\python convert2.py')
            d = datetime.datetime.today()
            print d.strftime('%Y/%m/%d %H:%M:%S') + ' converted.'
            return


if __name__ in '__main__':
    while 1:
        event_handler = ChangeHandler()
        observer = Observer()
        observer.schedule(event_handler,BASEDIR,recursive=True)
        observer.start()
        try:
            while True:
                time.sleep(1)
        except KeyboardInterrupt:
            observer.stop()
        observer.join()

コンバートするスクリプト convert2.py が 3.x 系なので os.system でコマンドプロンプトから実行するようにしています。こんなのでいいのかわかりませんが、一応うまくいっているようなのでよしとしましょう。

あと、try-except など後半部分はまだ完全に理解できていないのでもう少し勉強が必要ですね〜。