【问题标题】:Python watchdog duplicate eventsPython看门狗重复事件
【发布时间】:2014-05-25 21:03:01
【问题描述】:

我创建了一个修改过的看门狗示例,以便监视已添加到 Windows 中特定目录的 .jpg 照片文件。

import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

paths = []

xp_mode = 'off'

class FileHandler(FileSystemEventHandler):

    def on_created(self, event):
        if xp_mode == 'on':
            if not event.is_directory and not 'thumbnail' in event.src_path:
                print "Created: " + event.src_path
                paths.append(event.src_path)

    def on_modified(self, event):
        if not event.is_directory and not 'thumbnail' in event.src_path:
            print "Modified: " + event.src_path
            paths.append(event.src_path)

if __name__ == "__main__":
    path = 'C:\\'
    event_handler = FileHandler()
    observer = Observer()
    observer.schedule(event_handler, path, recursive=True)
    observer.start()
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observe r.stop()

    observer.join()

我注意到的一件事是,当添加文件时,on_created 和 on_modified 都会被调用!为了解决这个问题,我决定只使用 on_modified 方法。 但是,我开始注意到这也会导致多次回调,但这次是 on_modified 方法!

Modified: C:\images\C121211-0008.jpg
Modified: C:\images\C121211-0009.jpg
Modified: C:\images\C121211-0009.jpg <--- What?
Modified: C:\images\C121211-0010.jpg
Modified: C:\images\C121211-0011.jpg
Modified: C:\images\C121211-0012.jpg
Modified: C:\images\C121211-0013.jpg

我终其一生都无法弄清楚为什么会发生这种情况!好像也不太一致。如果有人能对这个问题有所了解,将不胜感激。

有一个类似的帖子,但它是针对 Linux 的:python watchdog modified and created duplicate events

【问题讨论】:

    标签: python python-2.7 pywin32 python-watchdog


    【解决方案1】:

    当一个进程写入一个文件时,它首先创建它,然后一次写入一个文件的内容。

    您看到的是与这些操作相对应的一组事件。有时,这些片段的编写速度足够快,以至于 Windows 只为所有片段发送一个事件,而其他时候您会收到多个事件。

    这很正常...取决于周围的代码需要做什么,保留修改后的路径名的 set 而不是 list 可能更有意义。

    【讨论】:

    • 那么可以将事件复制保持原样吗?我想为每个触发器(比如 lambda)做一些事情,所以这种类型的事情可能并不理想。除了将其存储为一组之外,还有其他选择吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多