我想监视一个dir,这个dir有子dir,subdir中有一些文件带有.md
。(可能还有其他文件,例如*.swp…)
我只想监视.md文件,我已经阅读了doc,只有一个ExcludeFilter
,并且在问题中:https://github.com/seb-m/pyinotify/issues/31说,只有dir可以过滤,但不能是文件。在
现在我要做的是在process_*
函数中过滤,通过fnmatch
检查event.name
。在
所以如果我只想监视指定的后缀文件,有没有更好的方法?谢谢。在
这是我写的主要代码:
!/usr/bin/env python
# -*- coding: utf-8 -*-
import pyinotify
import fnmatch
def suffix_filter(fn):
suffixes = ["*.md", "*.markdown"]
for suffix in suffixes:
if fnmatch.fnmatch(fn, suffix):
return False
return True
class EventHandler(pyinotify.ProcessEvent):
def process_IN_CREATE(self, event):
if not suffix_filter(event.name):
print "Creating:", event.pathname
def process_IN_DELETE(self, event):
if not suffix_filter(event.name):
print "Removing:", event.pathname
def process_IN_MODIFY(self, event):
if not suffix_filter(event.name):
print "Modifing:", event.pathname
def process_default(self, event):
print "Default:", event.pathname
您可以使用
ProcessEvent
的__call__
方法来集中对suffix_filter
的调用:我认为你的想法基本上是正确的,但是它可以更容易地实现。在
pyinotify模块中的
ProcessEvent
类已经有一个钩子可以用来过滤事件的处理。它是通过调用构造函数时给定的可选的pevent
关键字参数指定的,并保存在实例的self.pevent
属性中。默认值是None
。它的值在类“__call__()
”方法中使用,如pyinotify.py
源文件中的以下片段所示:因此,您可以使用它只允许对具有特定后缀(又称扩展名)的文件执行以下操作:
^{2}$您的解决方案没有什么特别的问题,但是您希望您的inotify处理程序尽可能快,因此可以进行一些优化。在
您应该将匹配后缀移出函数,这样编译器只生成一次:
我做了一套这样你就能更有效地匹配了:
^{2}$我只是假设
os.path.splitext
和集合搜索要比迭代的fnmatch
快,但是对于你的小扩展列表来说,这可能不是真的-你应该测试一下。在(注意:我已经在上面镜像了你的代码,当你匹配的时候你会返回False,但是我不相信这是你想要的-至少对于阅读你的代码的人来说这是不太清楚的)
相关问题 更多 >
编程相关推荐