当前位置: 首页 > 面试题库 >

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

申屠浩歌
2023-03-14
问题内容

在Ubuntu上运行,每次创建文件时,都会得到一个修改后的事件和一个创建的事件。

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

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

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

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


问题答案:

简短的回答: f = open(... , 'w')生成FileCreatedEventf.flush()或者f.close()可以生成FileModifiedEvent。是的,创建文件通常会同时生成FileCreatedEventFileModifiedEvents

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

尝试使用规范的看门狗脚本(如下),并且所有内容都应该更加清晰。

长答案:要查看发生了什么,请直接从docs运行规范的看门狗程序:

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

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

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')

但是当你冲洗时

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>


 类似资料:
  • 对于我当前的项目,我需要利用WatchService来跟踪给定目录中的事件。我的代码主要基于Oracles WatchService教程示例 但是,我需要将其限制为仅文件夹事件(例如ENTRY_CREATE C:\temp\folder_a)。 我试图做的是对目录的内容进行初始快照,并将每个内容路径存储到dirCache或fileCache中 如果注册了新事件,则应检查: 事件上下文是文件缓存中的

  • 我有一个对象,如下所示: 我想过滤并创建一个满足任何条件的新数组。例如:过滤器的名称为“AD”,并创建一个新的密钥数组,如下所示: 尝试地图 尝试过了。过滤器: 提前谢谢

  • 我发现了一个mysql创建表语法错误,希望有人能在我失去理智之前发现它。 错误1064(42000):您的SQL语法中有错误;查看与您的MySQL server版本相对应的手册,以了解在第2行“int not null auto_increment,Client_ID int not null,Start_Time varchar(5),star”附近使用的正确语法 mysql Ver 14.14

  • 另一方面,如果我们这样写,就没有并发修改异常!注意,代码完全相同,除了用于比较的字符串,在第一个示例中是代码,在第二个示例中是Java 我使用的是Netbeans 8.2,Windows 7 32bit,JDK 1.8.0_131有什么问题吗?

  • 我有一个数据帧列表。列表中的每个数据帧都是唯一的,这意味着有一些共享但不同的列。我想创建一个dataframe,它包含dataframe列表中的所有列,如果元素不存在,它将填充NaN。我试过以下方法 问题似乎是由于列表中的数据帧造成的。每个数据帧只有一行,因此其索引为零,因此重新编制索引不会起作用。我试过这个: 几乎生成一个随机数作为索引。但是,要获得此错误,请执行以下操作:

  • 我复制并制作一个文件。 当我对文件进行分类时,我得到: 然后我并立即显示: 但是当我再次使用cat键盘2时,我得到: 用sudo测试,用's/fr/us/'测试 我理解错了什么吗?sed应该写入文件还是需要通过管道覆盖原始文件?非常感谢。 版本: