Python监视程序在一个无休止的循环中完成,因为它监视的文件上有文件操作

时间:2016-02-24 21:46:22

标签: python python-watchdog

我正在编写一个python脚本,它使用监视程序来监视目录并对刚修改过的文件执行操作。 我的问题是脚本对文件执行的操作使用相同的文件重新填充监视程序的事件列表,因此脚本进入了一个无限循环。

无论如何要监视已修改的文件,并对它们执行操作而不再触发看门狗的操作?

   import os
   import watchdog.events
   import watchdog.observers    


    class OsyncStateHandler(watchdog.events.PatternMatchingEventHandler):
    """Writes state files"""

    def __init__(self, replica):
            self.replica = replica
            ignore = list()
            ignore.append(self.replica.path + self.replica.osync_dir + "*")
            watchdog.events.PatternMatchingEventHandler.__init__(self, ignore_patterns=ignore)
            self.move_file_handler = open(replica.moved_list_file, 'a')

    def __del__(self):
            self.del_file_handler.close()

    def on_modified(self, event):
            print(event.event_type)
            print(event.key)
            if (event.src_path == self.replica.path):
                    return
            # Fix for Rsync: update mtime with ctime so rsync will aknowldge attr changes (chmod / setfacl only change ctime)
            if (currentConfig['RSYNC_OPTIONS']['sync_attrs'].lower() == "yes"):
                    update_mtime_with_ctime(event.src_path)
            self.mod_file_handler.write(event.src_path + '\n')
            self.mod_file_handler.flush()
            self.replica.increaseOss()


    INITREPLICA = Replica(INITIATOR_TYPE, currentConfig['REPLICAS'][INITIATOR_TYPE])
    fs_event_handler = OsyncStateHandler(INITREPLICA)
    fs_observer = watchdog.observers.Observer()
    fs_observer.schedule(fs_event_handler, INITREPLICA.path, recursive=True)

    fs_observer.start()
    try:
            while True:
                    time.sleep(2)
    except KeyboardInterrupt:
            fs_observer.stop()
    fs_observer.join()

我认为暂停观察者将是执行我的mtime更新功能的想法,但是当发生这种情况时,可能不会监视复制到目录的其他文件。

有没有让看门狗放弃文件系统上的这个功能动作?或者告诉看门狗放弃脚本本身所做的每一个动作?

此致 Ozy。

1 个答案:

答案 0 :(得分:0)

没关系,我找到了一个讨厌但有效的解决方案。保留刚刚在列表中修改的文件,如果下一个事件对应于该文件,请将其从列表中删除,但不要继续。

    def __init__(self, replica):
            self.replica = replica
            self.ignore = list()
            self.ignore.append(self.replica.path + self.replica.osync_dir + "*")
            self.ignoreevents = list()
            watchdog.events.PatternMatchingEventHandler.__init__(self, ignore_patterns=se$
            self.mod_file_handler = open(replica.modded_list_file, 'a')

    def __del__(self):
            self.del_file_handler.close()

    def on_modified(self, event):
            print(event.event_type)
            print(event.key)
            if (event.src_path == self.replica.path):
                    return
            if (event.src_path in self.ignoreevents):
                    self.ignoreevents.remove(event.src_path)
                    return

            # Fix for Rsync: update mtime with ctime so rsync will aknowldge attr changes$
            if (CONFIG['RSYNC_OPTIONS']['sync_attrs'].lower() == "yes"):
                    # Precision of ctime only works in Python 3+
                    ctime = os.path.getctime(event.src_path)
                    os.utime(event.src_path, (ctime, ctime))
                    self.ignoreevents.append(event.src_path)
            self.mod_file_handler.write(event.src_path + '\n')
            self.mod_file_handler.flush()
            self.replica.increaseOss()