来自两个不同目录的文件的Python看门狗



我正在尝试使用Python的监视狗模块来收听文件系统更改。我想监视两个不同目录的文件。对于单个文件观看,我使用了watchdog.eventsPatternMatchingEventHandler。我想将其用于多个目录。

代码:

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

在上面的代码中,我尝试执行多个目录观察格式,并为每个文件创建一个事件处理程序。这对我不起作用。我这里有什么我缺少的吗?这样做的方法是什么?

谢谢。

在此处有些错误

EventHandler(patterns = patterns[i])

arg patterns是一种列表,因此您可以使用此

patterns = [["/home/user1/first/first.log"], ["/home/user1/second/second.log"]]
EventHandler(patterns = patterns[i])

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

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

我正在使用python3,linux os

按照上述建议的次要修改,而我的侧面也有一些添加

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

与我的比较,您缺少eof的 observer.join()。尝试。

编辑

在下面尝试以下代码:

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

最新更新