4

I am creating a python script that will identify changes to a log file and print some data from the new logs.

I use watchdog to create an event handler and everything seems to work fine except from that, I get duplicate events every time I modify the file. I checked creation and delete, they both work as expected and trigger one time.

I have read the similar question which explains having a created and a modified event when I save a file but this is not my case. I just get two modification events.

Here is my code:

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

any ideas would be appreciated

EDIT:

After some debugging I found out that Windows10 is changing the file modification time twice every time I save it.

The proof of concept code is this:

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

enter image description here

Final edit:

After testing my code on linux (Debian Stretch to be exact) it worked like a charm. So this combined with the previous edit probably shows that watchdog works fine and it is windows10 that has some issue. Should I post it on a different question or here?

George Sp
  • 524
  • 3
  • 17

0 Answers0