python - 看门狗运行功能一次
问题描述
下面是我的看门狗脚本。在 Vim 中修改文件时,会触发删除然后创建的事件。这是意料之中的。
这导致了问题。我希望它忽略使用 Vim 修改文件时的已删除事件并运行修改后的函数,但在实际删除文件时运行已删除的函数。
在不改变我的 Vim 配置的情况下这可能吗?
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
WATCH_PATH = './files'
class Handler(FileSystemEventHandler):
def on_any_event(self, event):
if event == 'modified':
modified(event.src_path)
if event == 'created':
created(event.src_path)
if event == 'deleted':
deleted(event.src_path)
def modified(src):
print(src, 'modified')
def created(src):
print(src, 'created')
def deleted(src):
print(src, 'deleted')
if __name__ == "__main__":
eh = Handler()
observer = Observer()
observer.schedule(eh, path=WATCH_PATH, recursive=True)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
日志
2020-04-26 03:47:02 - Deleted file: ./files/a.txt
2020-04-26 03:47:02 - Modified directory: ./files
2020-04-26 03:47:10 - Created file: ./files/a.txt
2020-04-26 03:47:10 - Modified directory: ./files
维姆
Vim 被配置为临时文件不存储在工作目录中。
解决方案
为了更好地理解这个问题,我稍微修改了你的代码。
...
from watchdog.events import FileSystemEventHandler, LoggingEventHandler
...
if __name__ == "__main__":
# eh = Handler()
eh = LoggingEventHandler()
logging.basicConfig(level=logging.INFO,
format='%(asctime)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S')
observer = Observer()
...
在函数中替换FileSystemEventHandler
为,它将生成事件日志。在修改目录 './file' 中的文本文件时,生成的日志如下:LoggingEventHandler
main
2020-04-26 12:41:25 - Created file: ./files/b.txt~
2020-04-26 12:41:25 - Modified directory: ./files
2020-04-26 12:41:25 - Modified file: ./files/b.txt~
2020-04-26 12:41:25 - Modified file: ./files/b.txt
2020-04-26 12:41:25 - Modified file: ./files/b.txt
2020-04-26 12:41:25 - Deleted file: ./files/b.txt~
2020-04-26 12:41:25 - Modified directory: ./files
这里删除的文件是b.txt~
中间文件,而不是您的原始文件。所以你只需要过滤掉中间文件的事件。
这是修复的代码:
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler, LoggingEventHandler
WATCH_PATH = './files'
class Handler(FileSystemEventHandler):
def on_any_event(self, event):
if str(event.src_path).endswith("~"):
return None
if event.event_type == 'modified':
modified(event.src_path)
elif event.event_type == 'created':
created(event.src_path)
elif event.event_type == 'deleted':
deleted(event.src_path)
def modified(src):
print(src, 'modified')
def created(src):
print(src, 'created')
def deleted(src):
print(src, 'deleted')
if __name__ == "__main__":
eh = Handler()
observer = Observer()
observer.schedule(eh, path=WATCH_PATH, recursive=True)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
print("Stopping the observer...")
observer.stop()
observer.join()
输出:
./files modified
./files/b.txt modified
./files modified
推荐阅读
- android - Android YUV_420_888 to RGBA with ScriptIntrinsicYuvToRGB NV21 and nio buffers in JNI
- javascript - 如何使用 Javascript 或 ExtJs 删除 HTML 块中没有属性的 span 标签
- php - 在 PHP 中通过 foreach 和 mysql 创建分组行
- javascript - 我已经安装了 opusscript / @discordjs/opus 似乎找不到 Opus 引擎
- regex - 正则表达式匹配行,其中第一个单词在该行的其他地方重复
- c# - 如何让visual studio高亮关键词
- cuda - ptxas 抱怨(输入)我悲伤的设备功能
- python - 叶图返回“TypeError:int64 类型的对象不是 JSON 可序列化的”
- android - 在 Android Studio 中打开对话框时,如何让我的活动保持运行?
- ruby-on-rails - 为什么 User.count 返回 0,直到 bin/spring 在 Ruby on Rails 中重新启动?