Python 3.x Python看门狗模块重复事件(编辑:不是看门狗问题)

Python 3.x Python看门狗模块重复事件(编辑:不是看门狗问题),python-3.x,windows-10,pywin32,python-watchdog,Python 3.x,Windows 10,Pywin32,Python Watchdog,我正在创建一个python脚本,它将识别对日志文件的更改,并从新日志中打印一些数据 我使用watchdog来创建一个事件处理程序,一切似乎都很好,除了这个,我每次修改文件时都会得到重复的事件。我检查了创建和删除,它们都按预期工作,并触发一次 我读过一个类似的问题,它解释了在保存文件时创建和修改事件,但这不是我的情况。我只得到两个修改事件 这是我的密码: import os, sys, time import subprocess import threading import win32pri

我正在创建一个python脚本,它将识别对日志文件的更改,并从新日志中打印一些数据

我使用watchdog来创建一个事件处理程序,一切似乎都很好,除了这个,我每次修改文件时都会得到重复的事件。我检查了创建和删除,它们都按预期工作,并触发一次

我读过一个类似的问题,它解释了在保存文件时创建和修改事件,但这不是我的情况。我只得到两个修改事件

这是我的密码:

import os, sys, time
import subprocess
import threading

import win32print
from tkinter import filedialog
from tkinter import *


from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler


class Handler(FileSystemEventHandler):
# docstring for FileSystemEventHandler
    def __init__(self, observer, filename, dirname):
        # super(Handler, FileSystemEventHandler).__init__(self,)
        self.observer = observer
        self.filename = filename
        self.dirname = dirname

        print("Handler filename = " , self.filename)
        print("Handler dirname = " , self.dirname)

    def on_modified(self, event):
        if self.filename == event.src_path:
            print("The file was modified")
            print (event.src_path)
            # go get the last line and print the data
            # try:
            #   hJob = win32print.StartDocPrinter (hPrinter, 1, ("test of raw data", None, "RAW"))
            #   try:
            #     win32print.StartPagePrinter (hPrinter)
            #     win32print.WritePrinter (hPrinter, raw_data)
            #     win32print.EndPagePrinter (hPrinter)
            #   finally:
            #     win32print.EndDocPrinter (hPrinter)
            # finally:
            #   win32print.ClosePrinter (hPrinter)


    def on_created(self, event):
        print("A file was created (", event.src_path, ")")

    def on_deleted(self, event):
        print("A file was deleted (", event.src_path, ")")


if __name__ == "__main__":
    Flags=2
    Name=None
    Level=1
    printers = win32print.EnumPrinters(Flags, Name, Level)

    print("\nChoose a printer to use:")
    i=1
    for p in printers:
      print(i,')' , p[2])
      i = i+1


if sys.version_info >= (3,):
  raw_data = bytes ("This is a test", "utf-8")
else:
  raw_data = "This is a test"
printer = int(input())

printer_name = printers[printer-1][2] #win32print.GetDefaultPrinter ()
print("You chose ", printer_name, "\nI will now print from the specified file with this printer")
hPrinter = win32print.OpenPrinter (printer_name)


# root = Tk()
# root.filename =  filedialog.askopenfilename(initialdir = "/Desktop",title = "Select file",filetypes = (("log files","*.log"),("all files","*.*")))
file_path = "some_file_path"    #   root.filename
file_directory = os.path.dirname(file_path)
# print (file_path)
print (file_directory)

observer = Observer()
event_handler = Handler(observer, file_path, file_directory)
observer.schedule(event_handler, path=file_directory, recursive=False)
observer.start()
observer.join()
如有任何意见,将不胜感激

编辑:

经过一些调试后,我发现Windows10每次保存文件时都会更改两次文件修改时间

概念验证代码如下:

prev_modification_time = os.path.getmtime(file_path)
    while True:
        current_mod_time = os.path.getmtime(file_path)
        if prev_modification_time != current_mod_time :
            print ("the file was modified, last modification time is: ", current_mod_time)
            prev_modification_time = current_mod_time
        pass

最终编辑:

在linux上测试我的代码(确切地说是Debian Stretch)后,它工作得非常出色。因此,这与之前的编辑相结合,可能表明watchdog工作正常,而windows10存在一些问题。我应该把它贴在另一个问题上还是贴在这里