pyinotify介绍

pyinotify模块用来监测文件系统的变化,依赖于Linux内核的inotify功能,inotify是一个事件驱动的通知器,其通知接口从内核空间到用户空间通过三个系统调用。pyinotify结合这些系统调用,提供一个顶级的抽象和一个通用的方式来处理这些功能。

Linux在2.6.13版本以后才提供了inotify。

安装pyinotify

  这里使用如下命令安装pyinotify模块

pip3 install pyinotify

  安装完毕后,可以直接在命令行中使用

python3 -m pyinotify /tmp

  当/tmp目录发生事件时,会输出事件信息

<Event dir=False mask=0x20 maskname=IN_OPEN name=daxin.txt path=/tmp pathname=/tmp/daxin.txt wd=1 >
<Event dir=False mask=0x1 maskname=IN_ACCESS name=daxin.txt path=/tmp pathname=/tmp/daxin.txt wd=1 >
<Event dir=False mask=0x10 maskname=IN_CLOSE_NOWRITE name=daxin.txt path=/tmp pathname=/tmp/daxin.txt wd=1 >
<Event dir=False mask=0x2 maskname=IN_MODIFY name=daxin.txt path=/tmp pathname=/tmp/daxin.txt wd=1 >
<Event dir=False mask=0x20 maskname=IN_OPEN name=daxin.txt path=/tmp pathname=/tmp/daxin.txt wd=1 >
<Event dir=False mask=0x2 maskname=IN_MODIFY name=daxin.txt path=/tmp pathname=/tmp/daxin.txt wd=1 >
<Event dir=False mask=0x8 maskname=IN_CLOSE_WRITE name=daxin.txt path=/tmp pathname=/tmp/daxin.txt wd=1 >

pyinotify模块API

  Notifier是pyinotify模块最重要的类,用来读取通知和处理事件,默认情况下,Notifier处理事件的方式是打印事件。

  Notifier类在初始化时接受多个参数,但是只有WatchManager对象是必须传递的参数,WatchManager对象保存了需要监视的文件和目录,以及监视文件和目录的哪些事件,Notifier类根据WatchManager对象中的配置来决定如何处理事件。

#!/usr/bin/env python3

import pyinotify

wm = pyinotify.WatchManager()              # 创建WatchManager对象
wm.add_watch('/tmp',pyinotify.ALL_EVENTS) # 添加要监控的目录,以及要监控的事件,这里ALL_EVENT表示所有事件 notifier = pyinotify.Notifier(wm) # 交给Notifier进行处理
notifier.loop() # 循环处理事件

事件标志

  pyinotify 仅仅是对 inotify 的Python封装,inotify提供了多种事件,基本上事件名称和含义都是相同的。常用的事件标志有:

事件标志 事件含义
IN_ACCESS 被监控项目或者被监控目录中的文件被访问,比如一个文件被读取
IN_MODIFY 被监控项目或者被监控目录中的文件被修改
IN_ATTRIB 被监控项目或者被监控目录中的文件的元数据被修改
IN_CLOSE_WRITE 一个打开切等待写入的文件或者目录被关闭
IN_CLOSE_NOWRITE 一个以只读方式打开的文件或者目录被关闭
IN_OPEN 文件或者目录被打开
IN_MOVED_FROM 被监控项目或者目录中的文件被移除监控区域
IN_MOVED_TO 文件或目录被移入监控区域
IN_CREATE 在所监控的目录中创建子目录或文件
IN_DELETE 在所监控的目录中删除目录或文件
IN_CLOSE* 文件被关闭,等同于IN_CLOSE_WRITE*
IN_MOVE 文件被移动,等同于IN_CLOSE_NOWRITE

  上面列举的是事件的标志位,我们可以用'与'来关联监控多个事件。

multi_event = pyinotify.IN_OPEN | pyinotify.IN_CLOSE_NOWRITE  

PS:python3中 IN_CLOSE好像被移除了

事件处理

  前面的例子,我们使用的都是默认的事件处理方式:打印在屏幕上,而很多情况下我们需要定制事件的处理方式,来实现特殊的功能。

  定制事件需要继承ProcessEvent类,针对需要处理的事件编写 process_事件名(self,event) 函数即可

import pyinotify

multi_event = pyinotify.IN_OPEN | pyinotify.IN_CLOSE_NOWRITE    # 监控多个事件
wm = pyinotify.WatchManager() # 创建WatchManager对象 class MyEventHandler(pyinotify.ProcessEvent): # 定制化事件处理类,注意继承
def process_IN_OPEN(self,event): # 必须为process_事件名称,event表示事件对象
print('OPEN',event.pathname) # event.pathname 表示触发事件的文件路径
def process_IN_CLOSE_NOWRITE(self,event):
print('CLOSE_NOWRITE',event.pathname) handler = MyEventHandler() # 实例化我们定制化后的事件处理类
notifier = pyinotify.Notifier(wm,handler) # 在notifier实例化时传入,notifier会自动执行 wm.add_watch('/tmp',multi_event) # 添加监控的目录,及事件
notifier.loop()

  

Python模块学习 - pyinotify的更多相关文章

  1. 【目录】Python模块学习系列

    目录:Python模块学习笔记 1.Python模块学习 - Paramiko  - 主机管理 2.Python模块学习 - Fileinput - 读取文件 3.Python模块学习 - Confi ...

  2. 【转】Python模块学习 - fnmatch & glob

    [转]Python模块学习 - fnmatch & glob 介绍 fnmatch 和 glob 模块都是用来做字符串匹配文件名的标准库. fnmatch模块 大部分情况下使用字符串匹配查找特 ...

  3. Python模块学习filecmp文件比较

    Python模块学习filecmp文件比较 filecmp模块用于比较文件及文件夹的内容,它是一个轻量级的工具,使用非常简单.python标准库还提供了difflib模块用于比较文件的内容.关于dif ...

  4. python模块学习第 0000 题

    将你的 QQ 头像(或者微博头像)右上角加上红色的数字,类似于微信未读信息数量那种提示效果. 类似于图中效果: 好可爱>%<! 题目来源:https://github.com/Yixiao ...

  5. Python模块学习:logging 日志记录

    原文出处: DarkBull    许多应用程序中都会有日志模块,用于记录系统在运行过程中的一些关键信息,以便于对系统的运行状况进行跟踪.在.NET平台中,有非常著名的第三方开源日志组件log4net ...

  6. 解惑Python模块学习,该如何着手操作...

    Python模块 晚上和朋友聊天,说到公司要求精兵计划,全员都要有编程能力.然后C.Java.Python-对于零基础入门的,当然是选择Python的人较多了.可朋友说他只是看了简单的语法,可pyth ...

  7. Python模块学习

    6. Modules If you quit from the Python interpreter and enter it again, the definitions you have made ...

  8. Python模块学习系列

    python模块-time python模块-datetime python模块-OS模块详解

  9. Python模块学习遇到的问题

    Python使用import导入模块时报ValueError: source code string cannot contain null bytes的解决方案 Python使用import导入模块 ...

随机推荐

  1. [剑指Offer] 48.不用加减乘除做加法

    题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. [思路] 首先看十进制是如何做的: 5+7=12,三步走第一步:相加各位的值,不算进位,得到2.第二步:计算进 ...

  2. BZOJ 2241 打地鼠(特技暴力)

    果然暴力出奇迹.. O(n^2m^2)=1e8 536ms能过. 枚举锤子的长和宽,再验证是否可以满足条件并更新答案. 我们先从左上角为(1,1)的先锤,显然锤的次数是a[1][1]. 锤(i,j)的 ...

  3. IOI 98 (POJ 1179)Polygon(区间DP)

    很容易想到枚举第一步切掉的边,然后再计算能够产生的最大值. 联想到区间DP,令dp[i][l][r]为第一步切掉第i条边后从第i个顶点起区间[l,r]能够生成的最大值是多少. 但是状态不好转移,因为操 ...

  4. POJ3243:Clever Y——题解

    http://poj.org/problem?id=3243 求最小的非负整数y满足x^y=k(mod z) 写完板子之后等待了半个小时poj才终于进入…… poj不行啊.jpg 以前一直觉得BSGS ...

  5. [BZOJ1131/POI2008]Sta树的深度

    Description 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大 Input 给出一个数字N,代表有N个点.N<=1000000 下面N-1条边. Output ...

  6. dubbox小demo

    概述: 我们建立两个web项目,一个是service负责提供服务,另一个是web项目负责调用服务. 两个项目都是 maven Project 项目 生产者项目: 项目中主要就是: pom文件,引入相关 ...

  7. 获取 exception 对象的字符串形式(接口服务返回给调用者)

    工具类: package com.taotao.common.utils; import java.io.PrintWriter; import java.io.StringWriter; publi ...

  8. 000 Python常识与快捷键(未完)

    1.Python控制台IDLE的快捷键 Alt + N :返回开始输入的第一条语句 Alt + P :返回刚刚输入的上一条语句 Tab:制表符,用于缩进或补全内容,是Python语法格式的灵魂,作用涵 ...

  9. [解决]java.io.IOException: Cannot obtain block length for LocatedBlock

    在hadoop测试集群运行job的过程中发现部分运行失败,有Cannot obtain block length for LocatedBlock,使用hdfs dfs -cat ${文件}的时候也报 ...

  10. python---异步IO(asyncio)协程

    简单了解 在py3中内置了asyncio模块.其编程模型就是一个消息循环. 模块查看: from .base_events import * from .coroutines import * #协程 ...