2

每次修改某个文件时,我都试图启动一个 python 脚本。准确地说,我在 Raspberry Pi 的串行端口上有一个设备,它将数据写入文本文件(test.txt)。我已经尝试了这两种工具 - Watchdog / Pinotify。每次修改文件(触发事件Watchdog:on_modified/Pyinotify:)IN_MODIFY,它都会重复触发。我已经尝试了所有其他方法,即使IN_CLOSE_WRITE正如某些人所建议的那样,但这根本不起作用。有人知道,一次文件更新如何只触发一个事件?

我使用 Pyinotify 的代码(有点编辑的教程文件):

import pyinotify,subprocess
def onChange(ev):
    cmd = ['/usr/bin/env', 'python', 'doThisFile.py', ev.pathname]
    subprocess.Popen(cmd).communicate()
wm = pyinotify.WatchManager()
wm.add_watch('/home/pi/test.txt', pyinotify.IN_MODIFY, onChange)
notifier = pyinotify.Notifier(wm)
notifier.loop()

或看门狗:

#!/usr/bin/python
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import subprocess
class MyHandler(FileSystemEventHandler):
    def on_modified(self, event):
        subprocess.call("/home/pi/doThisFile.py")
        print("Code started")
if __name__ == "__main__":
    event_handler = MyHandler()
    observer = Observer()
    observer.schedule(event_handler, path='.', recursive=False)
    observer.start()
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()
4

2 回答 2

1

我在使用时遇到了同样的问题pyinotify。但改变IN_MODIFYIN_CLOSE_WRITE解决问题。您可以从此答案中获得更多信息

于 2018-07-26T15:14:55.100 回答
0

这可能是因为用于编辑源代码的文本编辑器。解决方案:计算两个事件之间的时间,例如,如果事件触发过于频繁,则从其中一个事件中退出处理程序。

class SubEventHandler(FileSystemEventHandler):
    def __init__(self):
        self._time0 = self.getTime()
    def on_modified(self, event):
        time1 = self.getTime()
        if (time1 - self._time0) < 5:
            exit(0) # not sure it will exit properly
于 2021-09-28T08:37:26.173 回答