python pyinotify监视di中指定的后缀文件

2024-05-16 13:38:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我想监视一个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

Tags: 文件nameselfeventifdefdirfilter
3条回答

您可以使用ProcessEvent__call__方法来集中对suffix_filter的调用:

class EventHandler(pyinotify.ProcessEvent):
    def __call__(self, event):
        if not suffix_filter(event.name):
            super(EventHandler, self).__call__(event)

    def process_IN_CREATE(self, event):
        print "Creating:", event.pathname

    def process_IN_DELETE(self, event):
        print "Removing:", event.pathname

    def process_IN_MODIFY(self, event):
        print "Modifying:", event.pathname

我认为你的想法基本上是正确的,但是它可以更容易地实现。在

pyinotify模块中的ProcessEvent类已经有一个钩子可以用来过滤事件的处理。它是通过调用构造函数时给定的可选的pevent关键字参数指定的,并保存在实例的self.pevent属性中。默认值是None。它的值在类“__call__()”方法中使用,如pyinotify.py源文件中的以下片段所示:

def __call__(self, event):
    stop_chaining = False
    if self.pevent is not None:
        # By default methods return None so we set as guideline
        # that methods asking for stop chaining must explicitly
        # return non None or non False values, otherwise the default
        # behavior will be to accept chain call to the corresponding
        # local method.
        stop_chaining = self.pevent(event)
    if not stop_chaining:
        return _ProcessEvent.__call__(self, event)

因此,您可以使用它只允许对具有特定后缀(又称扩展名)的文件执行以下操作:

^{2}$

您的解决方案没有什么特别的问题,但是您希望您的inotify处理程序尽可能快,因此可以进行一些优化。在

您应该将匹配后缀移出函数,这样编译器只生成一次:

EXTS = set([".md", ".markdown"])

我做了一套这样你就能更有效地匹配了:

^{2}$

我只是假设os.path.splitext和集合搜索要比迭代的fnmatch快,但是对于你的小扩展列表来说,这可能不是真的-你应该测试一下。在

(注意:我已经在上面镜像了你的代码,当你匹配的时候你会返回False,但是我不相信这是你想要的-至少对于阅读你的代码的人来说这是不太清楚的)

相关问题 更多 >