それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Windowsのフォルダを監視する。IronPython の使い方とサンプル

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モデルはどうも好きになれないけど、いちからこう言うスクリプトと書けるほど実力もなかった。悔しかった。でも今ならぱぱっと書けるようになった。正直うれしかった。