1

我正在尝试使用 Python 的看门狗模块来监听文件系统的变化。我想监视来自两个不同目录的文件。对于单个文件监视,我使用PatternMatchingEventHandler了 from watchdog.events. 我想对多个目录使用相同的。

代码:

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

class EventHandler(PatternMatchingEventHandler):
    def on_modified(self, event):
        super(EventHandler, self).on_modified(event)
        print event

if __name__ == "__main__":
    dir_name = ["/home/user1/first", "/home/user1/second"]
    observer = Observer()
    patterns = ["/home/user1/first/first.log","/home/user1/second/second.log")]
    for i in xrange(len(dir_name)):
        event_handler = EventHandler(patterns = patterns[i])
        observer.schedule(event_handler, dir_name[i], recursive=True)
    observer.start()

    try:
        while True:
            time.sleep(0.1)
    except KeyboardInterrupt:
        observer.stop()

在上面的代码中,我尝试进行多目录观察格式并为每个文件创建一个事件处理程序。它不适合我。有什么我在这里想念的吗?这样做的方法是什么?

谢谢。

4

4 回答 4

1

这里有些错误

EventHandler(patterns = patterns[i])

argpatterns是一种列表,所以你可以像这样使用

patterns = [["/home/user1/first/first.log"], ["/home/user1/second/second.log"]]
EventHandler(patterns = patterns[i])
于 2019-05-29T10:46:59.360 回答
0

我正在使用python3,LINUX操作系统

经过上面建议的小修改和我这边的一些补充,现在可以正常工作了

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

class EventHandler(PatternMatchingEventHandler):
        def on_modified(self, event):
                super(EventHandler, self).on_modified(event)
                print(event)

if __name__ == "__main__":
        dir_name = ["/home/don/test1", "/home/don/test2"]
        observer = Observer()
        threads=[]
        patterns = [['*.log'],['*.ok']]
        for i in range(len(dir_name)):
                event_handler = EventHandler(patterns = patterns[i],ignore_directories=True,case_sensitive=False)
                observer.schedule(event_handler, dir_name[i], recursive=True)
                threads.append(observer)
        observer.start()

        try:
                while True:
                        time.sleep(0.1)
        except KeyboardInterrupt:
                observer.stop()
        observer.join()
于 2021-03-19T01:35:09.003 回答
0

虽然它不使用看门狗库,但如果您想检查可以使用任何变量附加它们并将它们存储在数组中的文件,这将是一种简单的方法来检查是否添加或删除了特定类型的文件

    import os
    import fnmatch
    import threading
    import time
    
    initial_count = 0
    flag = 0
    files = []
    
    path = ["/home/kirti/workspace/pythonproject6/img", "/home/kirti/workspace/pythonproject6/copy"]
    
    
    def taskcount(path, flag, initial_count):
        while 1:
            time.sleep(3)
            new_count = len(fnmatch.filter(os.listdir(path), "*.jpg"))
    
            if new_count > initial_count:
    
                if flag != 0:
                    print("Added \nCount :", new_count, "=", path)
                else:
                    print(new_count)
            if new_count < initial_count:
                print("Removed \nCount :", new_count, "=", path)
    
            initial_count = new_count
            flag = 1
    
    
    for j in range(len(path)):
        t = threading.Thread(target=taskcount, args=(path[j], flag, initial_count))
    
        t.start() 
于 2020-10-26T21:52:18.417 回答
-1

与我的相比,您observer.join()在EOF上有所欠缺。试试看。

编辑

试试下面的代码:

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

class EventHandler(PatternMatchingEventHandler):
    def on_modified(self, event):
        super(EventHandler, self).on_modified(event)
        print event

if __name__ == "__main__":
    observer = Observer()
    patterns = ["/home/user1/first/first.log","/home/user1/second/second.log"]
    for pattern in patterns:
        event_handler = EventHandler(patterns=pattern)
        observer.schedule(event_handler, dir_name[i], recursive=True)
    observer.start()

    try:
        while True:
            time.sleep(0.1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()
于 2017-06-23T11:15:53.477 回答