python watchdog修改并创建了重复事件

dbe*_*ers 4 python watchdog

在Ubuntu上运行,每次创建文件时我都会获得修改后的事件.

这是设计还是我做错了什么?

我正在使用事件处理程序类 PatternMatchingEventHandler

event_handler = MediaFileHandler(ignore_directories=True) 
observer = Observer() 
observer.schedule(event_handler, path=directory, recursive=True) 
observer.start()
Run Code Online (Sandbox Code Playgroud)

如果这是正确的行为,我可以安全地忽略创建的事件吗?

unu*_*tbu 9

简答: f = open(... , 'w')生成一个FileCreatedEvent,f.flush()或者f.close()可以生成一个FileModifiedEvent.所以,是的,创建一个文件经常生成FileCreatedEventFileModifiedEvents.

您是否可以安全地忽略FileCreatedEvents取决于您要执行的操作.如果您有兴趣在创建文件时做出反应,那么您需要处理FileCreatedEvents,并且可能忽略FileModifiedEvents,因为在修改文件时可以生成FileModifiedEvents而不生成FileCreatedEvents.

使用规范的看门狗脚本(下面),所有都应该更清楚.


答案很长:要了解正在发生的事情,请直接从文档中运行规范的监视程序:

import sys
import time
import logging
from watchdog.observers import Observer
from watchdog.events import LoggingEventHandler

if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO,
                        format='%(asctime)s - %(message)s',
                        datefmt='%Y-%m-%d %H:%M:%S')
    path = sys.argv[1] if len(sys.argv) > 1 else '.'
    event_handler = LoggingEventHandler()
    observer = Observer()
    observer.schedule(event_handler, path, recursive=True)
    observer.start()
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()
Run Code Online (Sandbox Code Playgroud)

从终端:

% mkdir ~/tmp
% cd ~/tmp
% script.py 
Run Code Online (Sandbox Code Playgroud)

现在,在w模式下打开文件时,在Python解释器中:

In [126]: f = open('/home/unutbu/tmp/foobar', 'w')
Run Code Online (Sandbox Code Playgroud)

终端打印

2014-02-05 16:29:34 - <FileCreatedEvent: src_path=/home/unutbu/tmp/foobar>
Run Code Online (Sandbox Code Playgroud)

当您写入文件时,看门狗不会报告任何事件:

In [127]: f.write('Hi')
Run Code Online (Sandbox Code Playgroud)

但是当你冲洗时,

In [128]: f.flush()
Run Code Online (Sandbox Code Playgroud)

它报告一个FileModifiedEvent:

2014-02-05 16:29:55 - <FileModifiedEvent: src_path=/home/unutbu/tmp/foobar>
Run Code Online (Sandbox Code Playgroud)

如果你在文件中写了更多东西:

In [129]: f.write(' there')
Run Code Online (Sandbox Code Playgroud)

类似地,当您关闭文件时会报告FileModifiedEvent,因为更多输出被刷新到磁盘:

In [130]: f.close()

2014-02-05 16:30:12 - <FileModifiedEvent: src_path=/home/unutbu/tmp/foobar>
Run Code Online (Sandbox Code Playgroud)