0

ディレクトリを監視したいのですが、ディレクトリにはサブディレクトリがあり、サブディレクトリには.md. (*.swp などの他のファイルがあるかもしれません...)

私は.mdファイルのみを監視したい、私はドキュメントを読みましたExcludeFilter、そして問題には.フィルタリングしますが、ファイルはフィルタリングしません。

今私がしていることは、関数をフィルタリングしてbyprocess_*をチェックすることです。event.namefnmatch

指定した接尾辞ファイルのみを監視したい場合、より良い方法はありますか? ありがとう。

これは私が書いたメインコードです:

!/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
4

3 に答える 3

2

基本的には正しい考えを持っていると思いますが、もっと簡単に実装できると思います。

pyinotifyモジュールのProcessEventクラスには、イベントの処理をフィルタリングするために使用できるフックが既に含まれています。コンストラクターへの呼び出しで指定されたオプションのキーワード引数を介して指定され、インスタンスの属性に保存されます。デフォルト値は です。この値は、ソース ファイルの次のスニペットに示すように、クラスのメソッドで使用されます。peventself.peventNone__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)

したがって、次のような特定のサフィックス(別名拡張子)を持つファイルのイベントのみを許可するために使用できます。

SUFFIXES = {".md", ".markdown"}

def suffix_filter(event):
    # return True to stop processing of event (to "stop chaining")
    return os.path.splitext(event.name)[1] not in SUFFIXES

processevent = ProcessEvent(pevent=suffix_filter)
于 2013-08-19T07:54:15.543 に答える
1

ソリューションに特に問題はありませんが、inotify ハンドラーをできるだけ高速にしたいので、いくつかの最適化を行うことができます。

マッチ サフィックスを関数の外に移動して、コンパイラがそれらを 1 回だけビルドするようにする必要があります。

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

より効率的なマッチングができるように、それらをセットにしました。

def suffix_filter(fn):
  ext = os.path.splitext(fn)[1]
  if ext in EXTS:
    return False
  return True

私はそれos.path.splitextとセット検索が反復よりも速いと推測しているだけですfnmatchが、これは拡張機能の非常に小さなリストには当てはまらない場合があります-テストする必要があります.

(注:一致したときにFalseを返す上記のコードをミラーリングしましたが、それがあなたの望むものであるとは確信していません-少なくとも、コードを読んでいる人にはあまり明確ではありません)

于 2013-08-19T01:06:06.027 に答える