2012-07-07 6 views
0

아래 코드는 내가 원하는 것처럼 작동하지 않습니다. 내가 할 때 svc.run() 프로그램이 정상적으로 실행됩니다. 내 폴더 작업 파일에 대한 변경 사항. 그러나 내가 할 때 svc.stop() 그것은 정확하게 멈추지 않는다고 생각한다. 아마도폴더 감시자 프로그램 시작, 정지 기능을 사용 가능하게 설정합니다.

import pyinotify 
import threading 
import time 
import os 
class fs_event_handler(pyinotify.ProcessEvent): 
    def __init__(self, callback): 
     self._callback = callback 
    def process_IN_CREATE(self, e): 
     self._callback(e.path, e.name, 'created') 
    def process_IN_DELETE(self, e): 
     self._callback(e.path, e.name, 'deleted') 
    def process_IN_MODIFY(self, e): 
     self._callback(e.path, e.name, 'modified') 

class NotificationService(): 
    def __init__(self, path, callback): 
     mask = pyinotify.IN_CREATE | pyinotify.IN_DELETE \ 
      | pyinotify.IN_MODIFY 
     w = pyinotify.WatchManager() 
     self.__notifier = pyinotify.Notifier(w, fs_event_handler(callback)) 
     wdd = w.add_watch(path, mask, rec=True, auto_add=True) 
     self.__loop = True 
    def start(self): 
     while self.__loop: 
      self.__notifier.process_events() 
      if self.__notifier.check_events(): 
       self.__notifier.read_events() 
    def run(self): 
     fm = FileMonitor(self) 
     fm.start() 
     print 'Service Running...' 

    def stop(self): 
     self.__notifier.stop() 
     self.__loop = False 

class FileMonitor(threading.Thread): 
    def __init__(self, srvc): 
     threading.Thread.__init__(self) 
     self.__svc = srvc 
    def run(self): 
     self.__svc.start() 
     print 'Service stopped' 

def _callback(path, name, operation): 
    zpad = lambda x: ''.join(['0', str(x)])[:2] 
    ts = time.localtime() 
    t = ':'.join(map(zpad, [ts.tm_hour, ts.tm_min, ts.tm_sec])) 
    print t, ':', '%s was %s' % (os.path.join(path, name), operation) 


p = '/home/deostroll/scripts/tmp' 
svc = NotificationService(p, _callback) 
svc.run() 

답변

1

나는 pyinorify을 잘 모르겠지만, 어떤 이벤트가 발생할 때까지 self.__notifier.process_events() 블록이 너무 self.__loop 읽을되지 않는 것 같습니다 ... 스레딩 부분을하는 더 나은 방법이 있어야합니다.

당신은 대신 pyinotify.ThreadedNotifier을 사용할 수 있습니다 : 마법처럼

class NotificationService(): 
    def __init__(self, path, callback): 
     self.path = path 
     self.callback = callback 

    def start(self): 
     mask = pyinotify.IN_CREATE | pyinotify.IN_DELETE \ 
      | pyinotify.IN_MODIFY 
     w = pyinotify.WatchManager() 
     wdd = w.add_watch(self.path, mask, rec=True, auto_add=True) 
     self.__notifier = pyinotify.ThreadedNotifier(w, fs_event_handler(self.callback)) 
     self.__notifier.start() 
     print 'Service Running...' 

    def run(self): 
     self.start() 

    def stop(self): 
     self.__notifier.stop() 
     print 'Service Stopped' 
+0

작품을 ... – deostroll