Python看门狗修改和创建重复事件

7

在Ubuntu上运行时,每次创建文件都会触发修改和创建事件。

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

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

event_handler = MediaFileHandler(ignore_directories=True) 
observer = Observer() 
observer.schedule(event_handler, path=directory, recursive=True) 
observer.start()

如果这是正确的行为,那么我可以安全地忽略“created”事件吗?

1个回答

13
简短回答: f = open(... , 'w') 会生成一个FileCreatedEventf.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()

而从终端运行:

% mkdir ~/tmp
% cd ~/tmp
% script.py 

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

In [126]: f = open('/home/unutbu/tmp/foobar', 'w')

终端会输出。
2014-02-05 16:29:34 - <FileCreatedEvent: src_path=/home/unutbu/tmp/foobar>

当您向文件写入时,看门狗不会报告任何事件:
In [127]: f.write('Hi')

但是当你执行flush操作时,

In [128]: f.flush()

它报告了一个FileModifiedEvent事件:

2014-02-05 16:29:55 - <FileModifiedEvent: src_path=/home/unutbu/tmp/foobar>

如果您往文件中写入更多内容:
In [129]: f.write(' there')

类似地,当您关闭文件时会报告FileModifiedEvent事件,因为更多的输出会刷新到磁盘上:
In [130]: f.close()

2014-02-05 16:30:12 - <FileModifiedEvent: src_path=/home/unutbu/tmp/foobar>

好的,谢谢。这正是我所想的。我很感激你提供了详细的答案。 - dbers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接