2012-07-07 105 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 2012-07-07 17:52:08