python watchdog gui_Python监控(monitor)文件系统(Linux file system)事件(变化):watchdog、pyinotify...

很多时候,我们需要及时对文件系统(file sytem)的变化进行监控,以便第一时间 增量处理。Python 在这方面提供两个非常优秀的第三方开源工具:watchdog 和 pyinotify ,背后都是依赖 Linux 系统的 inotify 库。inotify 是一个Linux系统的特性,用于监控文件系统操作,比如:读取、写入和创建,比频繁的轮询要高效很多。

当然,监控文件系统时,我们可以轮询的方式,但这样效果非常低,极不优雅。所以,强烈建议使用 watchdog 或 pyinotify 。

通过对比,不难发现 watchdog 大有取代 pyinotify 之势。所以,新项目就最好直接使用 watchdog ,但旧项目就没有必要替换掉 pyinotify 了。

watchdog

通过 pip install watchdog 安装之后,我们就可以在 Python 代码中直接使用 watchdog,十分方便。可以自己实现监控的回调函数,或直接用已经提供好的函数。import sys

import time

import logging

from watchdog.observers import Observer

from watchdog.events import LoggingEventHandler

if __name__ == "__main__":

# 配置日志模块

logging.basicConfig(level=logging.INFO,

format='%(asctime)s - %(message)s',

datefmt='%Y-%m-%d %H:%M:%S')

# 定义监控目录的参数

path = sys.argv[1] if len(sys.argv) > 1 else '.'

# 日志事件句柄,实现了日志记录功能,也可以自己定义Handler

event_handler = LoggingEventHandler()

observer = Observer()

# 定义监控

observer.schedule(event_handler, path, recursive=True)

# 启动

observer.start()

try:

while True:

time.sleep(1)

except KeyboardInterrupt:

observer.stop()

observer.join()

LoggingEventHandler 的实现代码如下:class LoggingEventHandler(FileSystemEventHandler):

"""Logs all the events captured."""

def on_moved(self, event):

super(LoggingEventHandler, self).on_moved(event)

what = 'directory' if event.is_directory else 'file'

logging.info("Moved %s: from %s to %s", what, event.src_path,

event.dest_path)

def on_created(self, event):

super(LoggingEventHandler, self).on_created(event)

what = 'directory' if event.is_directory else 'file'

logging.info("Created %s: %s", what, event.src_path)

def on_deleted(self, event):

super(LoggingEventHandler, self).on_deleted(event)

what = 'directory' if event.is_directory else 'file'

logging.info("Deleted %s: %s", what, event.src_path)

def on_modified(self, event):

super(LoggingEventHandler, self).on_modified(event)

what = 'directory' if event.is_directory else 'file'

logging.info("Modified %s: %s", what, event.src_path)

我们就可以照葫芦画瓢了,实现自己想要的回调函数,官方的文档 的质量不是特别高,有些内容需要我们阅读源码,还好源码不是很复杂。

pyinotify

pyinotify 已经是老牌的文件系统监控的库了,已经比较稳定了,功能方面也满足需求。

也是可以通过 pip install pyinotify 进行安装。import pyinotify

wm = pyinotify.WatchManager()

# 定义监控事件,删除和创建

mask = pyinotify.IN_DELETE | pyinotify.IN_CREATE

# 返回的对象,方便之后的管理,比如:删除等

wdd = wm.add_watch('/tmp', mask, rec=True)

# 定义回调函数

class EventHandler(pyinotify.ProcessEvent):

def process_IN_CREATE(self, event):

print "Creating:", event.pathname

def process_IN_DELETE(self, event):

print "Removing:", event.pathname

handler = EventHandler()

# 将回调函数和监控组合

notifier = pyinotify.Notifier(wm, handler)

# 循环监控

notifier.loop()

相比 watchdog 的 API,pyinotify 的 API 稍微繁琐了一点点,整体上不分伯仲。pyinotify 的文档方面要强于 watchdog ,有大量的细节讲解。

总结

watchdog 目前还在持续更新,热度也很高,所以相比 pyinotify 已经很长时间不更新了,watchdog 的使用前景更可期待,API 的风格更符合现在的代码设计,推荐使用 watchdog 。

最后,安利大家一本书《深入理解NLP的中文分词:从原理到实践》,让你从零掌握中文分词技术,踏入NLP的大门。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,Python可以使用watchdog库来监控文件系统watchdog库可以监控文件和目录的创建、删除、修改和移动等操作,并在这些事件发生时触发相应的回调函数。具体来说,可以通过以下步骤来使用watchdog监控文件系统: 1. 安装watchdog库:可以通过pip命令来安装watchdog库,如下所示: ``` pip install watchdog ``` 2. 创建监控处理类:需要创建一个类,并继承watchdog.events.FileSystemEventHandler类,以处理文件系统事件。可以在这个类中实现on_created、on_deleted、on_modified和on_moved等方法,以处理相应的事件。 3. 创建监控器对象:需要创建一个监控器对象,并指定要监控的目录和处理类。可以使用watchdog.observers.Observer类来创建监控器对象。 4. 启动监控器:需要调用监控器对象的start方法来启动监控器。在监控器启动后,它将持续监控目录中的文件系统事件,并在事件发生时调用相应的处理类方法。 下面是一个简单的示例代码,演示如何使用watchdog监控文件系统: ```python import time from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler class MyHandler(FileSystemEventHandler): def on_created(self, event): if event.is_directory: print("Directory created: {}".format(event.src_path)) else: print("File created: {}".format(event.src_path)) if __name__ == "__main__": event_handler = MyHandler() observer = Observer() observer.schedule(event_handler, path='.', recursive=False) observer.start() try: while True: time.sleep(1) except KeyboardInterrupt: observer.stop() observer.join() ``` 在这个示例中,我们创建了一个名为MyHandler的处理类,它继承自FileSystemEventHandler类,并实现了on_created方法,以处理文件创建事件。然后,我们创建了一个监控器对象,并将其与处理类关联起来,指定要监控的目录为当前目录。最后,我们启动了监控器,并持续运行,直到用户按下Ctrl+C键停止监控器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值