Повторяющиеся события в модуле сторожевого таймера Python (редактирование: проблема не была сторожевым) - PullRequest
0 голосов
/ 24 августа 2018

Я создаю скрипт на python, который идентифицирует изменения в файле журнала и распечатывает некоторые данные из новых журналов.

Я использую сторожевой таймер для создания обработчика событий, и все, кажется, работает нормально, за исключением того, что я получаю повторяющиеся события каждый раз, когда я изменяю файл.Я проверил создание и удаление, они оба работают как положено и запускаются один раз.

Я прочитал аналогичный вопрос, который объясняет наличие созданного и измененного события при сохранении файла, но это не мой случай.Я просто получаю два события модификации.

Вот мой код:

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

enter image description here

Окончательное редактирование:

После тестирования моегоКод на Linux (Debian Stretch, если быть точным) работал как шарм.Таким образом, это в сочетании с предыдущим редактированием, вероятно, показывает, что сторожевой таймер работает нормально, и это проблема Windows10.Должен ли я разместить его на другой вопрос или здесь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...