2012-05-13 16 views
3

私はMac上です。私はLaunchdのWatchPathsディレクティブを使ってファイルの変更のためのディレクトリを見てきました。私のスクリプトは、監視されたディレクトリからファイルが追加または削除されたときにのみ起動します。ファイルを変更するディレクトリを監視する方法

ファイルが変更されたときただし、このスクリプトは、私は私のサイト]フォルダを同期するためのDIYのDropboxを作成しようとしている、基本的に...

をトリガしません。

launchd、bash、pythonでこれを行う方法はありますか?

私はLinuxにinotifyのようなものがあると思いますが、私はmacの解決策を認識していません。

+1

理想的には、N秒ごとに変更をポーリングしたくない... – jessh

+0

私が知っている唯一の解決策はポーリングです。私が提案しようとしていた方法の例は、ここで見つけることができます:https://github.com/jessemiller/HamlPy/blob/2e029110b6ab2f502439634ded7a781b4a521cfe/hamlpy/hamlpy_watcher.py#L28 - 私は誰でも提供できるかどうかを調べることに興味があります代替案! – modocache

+0

MacOSはFreeBSDスタイルの 'kqueue'をサポートしています。これは' inotify'に似ています。実際にそれを働かせるには、私は考えていません。 :-) – torek

答えて

2

私は(あまりにも、available on PyPIMacFSEvents パッケージを使用して、問題に私の手を試してみました:

import os 

from fsevents import Observer, Stream 


def callback(file_event): 
    print file_event.name # the path of the modified file 


def main(): 
    observer = Observer() 
    observe_path = os.getcwd() # just for this example 
    stream = Stream(callback, observe_path, file_events=True) 
    observer.start() 
    observer.schedule(stream) 


if __name__ == '__main__': 
    main() 

これ(あなたがチェックすることができ、ファイルが作成、変更、または削除されるたびcallbackを呼ぶであろうイベントは、file_event.maskの値を使用して発生しました)。

メインスレッド外のスレッドで監視することをお勧めします(上記プログラムは、終了することを拒否します(KeyboardInterruptでも)。 APIに関する詳細は、MacFSEvents READMEを参照してください。お役に立てれば!

+0

これは完全に役立ちます!私はスレッドに慣れていません..それについての詳細を学んだり、別のスレッドを観察するためのポインタはありますか? – jessh

+3

JoeFishさんは[Watchdog](http://pypi.python.org/pypi/watchdog)をお勧めします。それ以外の場合は、[これらの](http://www.artfulcode.net/articles/multi-threading-python/)[articles](http://www.ibm.com/developerworks/aix/library/au-threadingpython /)。 – modocache