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()
4

1 回答 1

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'
于 2012-07-07T07:00:36.910 回答