Windowsのフォルダを監視して、更新があったら取り込む。
というよくある処理。これを簡単にしたいなと思った。
Windowsのフォルダ監視は.NetFrameworkが楽ちん
.NetFrameworkが恐ろしくシンプルで簡単です。
from System.IO import * path = "C:\\Users\\takuya\\Desktop" fsw = FileSystemWatcher() fsw.Path = path def watcherhandler(self,*args): print args fsw.Changed += watcherhandler fsw.Created += watcherhandler fsw.Deleted += watcherhandler fsw.Renamed += watcherhandler fsw.EnableRaisingEvents = True while(True):fsw.WaitForChanged(WatcherChangeTypes.All, -1)
本当に、簡単です。
起動は
ipy sample_watcher.py
仕組み
.NetFramewokは、IronPythonから使える。
IronPythonはPython2.7を.netで実装し直したもの。2.7なら全機能が使える。
FileSystemWatcher は .net提供のライブラリ
IronPythonは
IronPhythonはCodePlexからダウンロードして使う。
ironpythonはインストーラーでもバイナリでもどちらでもおなじ。PATH通せば良い。
あとはipyコマンドで、インタラクティブシェルを起動すれば遊べる。
インストーラーなしで.netFrameWorkのスクリプトを書けるから、管理者権限無くてもプログラミング環境が入手できるのでウルトラ便利。
個人用途ならvbs使うよりオススメ。WindowForms作ったりさえも出来る。もちろんexe化も・・・
ironpythonからの.net クラス利用
名前空間と参照をインポートする。インポートは次のpythonコードになる。
import SystemIO.* from SystemIO import *
二つは微妙に違う。
import SystemIO.*の場合は
SystemIO.FileSystemWatcher()
でアクセス可能。
from SystemIO import * の場合
FileSystemWatcher()
でアクセス可能
このへんはPythonのimport と同じで、上手に融合してる。
クラスの初期化
FileSystemWatcher()
()をつけるだけ。newなどはしない。
これだけ知ってれば良い。
イベントハンドラの登録
def watcherhandler(self,*args): print args fsw.Changed += watcherhandler
FileSystemWactherについて
使い方はシンプルで
- インスタンス化
- 監視パスを指定
- コールバックを登録
- 監視開始
の流れになる。ただし、マルチスレッドで使うので、監視を初めても、メインスレッドをロックしないのです。
代わりに、次のメソッドでイベントキュー待ち
fsw.WaitForChanged(WatcherChangeTypes.All, -1)
ずっと監視するなら、while(1)で無限ループ
while(True):fsw.WaitForChanged(WatcherChangeTypes.All, -1)
ファイルに変化があったらプロセス起動
.NetFrameworkでプロセス起動しても良いんだけど、せっかくpythonなので、
import subprocess subprocess('sh rsync.sh")
とかやるとうれしいかも。良いとこ取り!
詳しくは、MSDN見ろってことだけど、MSDNなんてドラクエ2のラストダンジョンなみに迷路だし、妙なエンカウント多い。記号も多いからなれるまで大変な感がある。
FTPでファイルが届くのを待つだけの仕事で
設定ファイルやら、ジョブネットが時間起動だったりして面倒だったし。
cronやタスクスケジューラーでファイルが届くのを待つ。そんな仕事を山ほどやりました。POLLモデルはどうも好きになれないけど、いちからこう言うスクリプトと書けるほど実力もなかった。悔しかった。でも今ならぱぱっと書けるようになった。正直うれしかった。