2013-03-26 3 views
0

Я хочу создать модуль, который будет следить за папкой. Я пишу некоторые кода:методы pyinotify, не называемые

import os, pyinotify 

class FileWatcher: 
    def start_watch(self, dir): 
     wm = pyinotify.WatchManager() 
     self.notifier = pyinotify.Notifier(wm, EventProcessor()) 
     mask = pyinotify.IN_CREATE | pyinotify.IN_MODIFY | pyinotify.IN_DELETE | pyinotify.IN_DELETE_SELF | pyinotify.IN_MOVED_FROM | pyinotify.IN_MOVED_TO 
     wdd = wm.add_watch(dir, mask, rec=True) 
     while True: 
      self.notifier.process_events() 
      if self.notifier.check_events(): 
       self.notifier.read_events() 

    def stop_watch(self): 
     self.notifier.stop() 
     print ('\nWatcher stopped') 

class EventProcessor(pyinotify.ProcessEvent): 
    def process_IN_CREATE(self, event): 
     print('in CREATE') 

    def process_IN_MODIFY(self, event): 
     print('in MODIFY') 

    def process_IN_DELETE(self, event): 
     print('in delete') 

    def process_IN_DELETE_SELF(self, event): 
     print('in delete self') 

    def process_IN_MOVED_FROM(self, event): 
     print('in MOVED_FROM') 

    def process_IN_MOVED_TO(self, event): 
     print('in IN_MOVED_TO') 

if __name__ == "__main__": 
    watcher = FileWatcher() 
    try: 
     folder = "/home/user/Desktop/PythonFS" 
     watcher.start_watch(folder) 
    except KeyboardInterrupt: 
     watcher.stop_watch()  

Когда я модифицирует файл, а затем удалить его методы process_IN_MODIFY и process_IN_DELETE никогда не называют. Как кошка я его решаю?

Но когда я создаю файл, вызывается метод process_IN_CREATE().

ОС Linux Mint 13.

UPD: Новый код

+1

Umm, этот код не является синтаксически действительным (отступ отсутствует, просто вставьте его, выберите его и нажмите Ctrl + K), и он определяет только классы и функции и не вызывает ни одного из них. – phihag

+0

Это синтаксически vallid code .. Методы должны вызывать из уведомителя, потому что я помещаю экземпляр EventProcessor в конструктор pyinotify.Notifier (...) – Vetalll

+0

[Нет, это не так) (http://ideone.com/NJGsub). И почему есть некоторые вызываемые функции, код на самом деле их не вызывает. – phihag

ответ

1

Попробуйте следующий код. Это в основном то же самое, что и ваш код; Я только добавил

f = FileWatcher() 
f.start_watch('/tmp/test', None) 

в конце, чтобы начать FileWatcher. Убедитесь, что существует каталог /tmp/test, либо измените эту строку, чтобы указать на существующий каталог.

Если файл foo существует в /tmp/test, и если я могу изменить этот файл, вышеприведенные программа печатает

in create # after modification 
in modify # after saving 
in modify 
in delete 

Теперь, если я удалить файл, программа печатает:

in delete 

import os 
import pyinotify 


class FileWatcher: 
    notifier = None 

    def start_watch(self, dir, callback): 
     wm = pyinotify.WatchManager() 
     self.notifier = pyinotify.Notifier(wm, EventProcessor(callback)) 
     mask = (pyinotify.IN_CREATE | pyinotify.IN_MODIFY | pyinotify.IN_DELETE 
       | pyinotify.IN_DELETE_SELF | pyinotify.IN_MOVED_FROM 
       | pyinotify.IN_MOVED_TO) 
     wdd = wm.add_watch(dir, mask, rec=True) 
     while True: 
      self.notifier.process_events() 
      if self.notifier.check_events(): 
       self.notifier.read_events() 


class EventProcessor(pyinotify.ProcessEvent): 
    def __init__(self, callback): 
     self.event_callback = callback 

    def process_IN_CREATE(self, event): 
     # if self.event_callback is not None: 
     # self.event_callback.on_file_created(os.path.join(event.path, 
     # event.name)) 
     print('in create') 

    def process_IN_MODIFY(self, event): 
     # if self.event_callback is not None: 
     # self.event_callback.on_file_modifed(os.path.join(event.path, 
     # event.name)) 
     print('in modify') 

    def process_IN_DELETE(self, event): 
     print('in delete') 

    def process_IN_DELETE_SELF(self, event): 
     print('in delete self') 

    def process_IN_MOVED_FROM(self, event): 
     print('in moved_from') 

    def process_IN_MOVED_TO(self, event): 
     print('in moved to') 


f = FileWatcher() 
f.start_watch('/tmp/test', None) 

Кстати, как только вы звоните f.start_watch, процесс попадает в цикл while True, из которого он не может убежать. Даже вызов f.stop_watch из другого потока не приведет к выходу из этого цикла while.

Если вы планируете использовать многопоточность, возможно, придется пропускать threading.Event к start_watch, и проверить его состояние внутри while-loop, чтобы определить, когда выйти из цикла.