起因
经常在写程序的时候,要监听某个文件夹是否生成了新的文件,或者某个文件是否被修改了。也有时候是实时监控某个地方看看是不是被垃圾文件或病毒文件占据或者生成了log信息及时需要处理的。总而言之有很多种情况下,都需要对文件夹及文件进行监控并且及时作出相应的处理。这时候,一个简单的python脚本就能很好地解决问题了。
过程
简单地查了一下相应的库,有两个推荐的库可以很轻松地做到这个事,PyInotify和WatchDog,还是简单地看一下。
PyInotify
什么是PyInotify
PyInotify 是一个 Python 库,用于监视文件系统事件,例如文件的创建、删除、移动、重命名等。它基于 inotify 库,提供了一个 Python API,方便开发者使用。
PyInotify 支持 cross-platform,可以在 Linux、macOS 和 Windows 等操作系统上使用。它提供了多种方式来监视文件系统事件,例如通过回调函数、生成事件队列、异步监视等。
使用 PyInotify,可以方便地实现文件系统监视功能,例如监控某个目录下的文件变化、监控进程的输出等。它还可以与 Python 的其他库集成,例如 Django、Flask 等 Web 框架,实现 Web 应用的文件系统监视功能。
总结起来,PyInotify 是一个功能强大、易于使用的 Python 库,用于监视文件系统事件。它提供了多种监视方式,支持 cross-platform,是开发文件系统监视应用的理想选择。
安装和使用
我们还是通过pip安装:
pip install pyinotify
这时候,我们就可以直接在脚本中import进来使用了
import pyinotify
# 初始化 Inotify 实例
inotify_instance = pyinotify.Init()
# 设置监视目录 sys.argv[1]为需要监视的目录
inotify_instance.add_watch(sys.argv[1], pyinotify.IN_DELETE | pyinotify.IN_CREATE | pyinotify.IN_MOVED_FROM | pyinotify.IN_MOVED_TO)
# 循环等待事件
while True:
event = inotify_instance.wait()
# 处理事件
if event.is_deleted():
print(f"文件 {event.pathname()} 被删除")
elif event.is_created():
print(f"文件 {event.pathname()} 被创建")
elif event.is_moved_from():
print(f"文件 {event.pathname()} 从 {event.old_pathname()} 移动到当前位置")
elif event.is_moved_to():
print(f"文件 {event.pathname()} 从 {event.old_pathname()} 移动到 {event.pathname()}")
# 退出 Inotify 实例
inotify_instance.close()
在这个示例程序中,我们首先通过 pyinotify.Init() 初始化 Inotify 实例。然后,我们使用 inotify_instance.add_watch() 设置监视目录,并指定监视的事件类型,包括文件的创建、删除、移动等。
接下来,我们使用 inotify_instance.wait() 循环等待事件。每当有事件发生时,我们会通过 event.is_deleted()、event.is_created()、event.is_moved_from() 和 event.is_moved_to() 方法判断事件类型,并输出相应的信息。
最后,在程序结束时,我们使用 inotify_instance.close() 退出 Inotify 实例。
这个示例可以通过在命令行中运行 python pyinotify_example.py 来启动。例如,如果在命令行中运行 python pyinotify_example.py /home/user/docs,则程序将监视 /home/user/docs 目录下的文件变化,并在控制台输出相应的信息。
PyInotify的原理
PyInotify 的原理是通过 inotify 库与 Linux 内核中的 inotify 系统调用接口,来实现对文件系统事件的监视。
inotify 是 Linux 内核中的一个系统调用,用于监视文件系统事件。它可以监视指定目录下的文件事件,包括文件的创建、删除、移动、重命名等。inotify 提供了一个事件队列,可以存放正在等待处理的事件。当有新事件到达时,inotify 会将事件放入事件队列中,并通知进程。进程可以从事件队列中读取事件,并根据事件类型进行相应的处理。
PyInotify 通过封装 inotify 系统调用,提供了一个 Python API,方便开发者使用。它主要包括以下几个步骤:
初始化 Inotify 实例:使用 pyinotify.Init() 函数初始化 Inotify 实例,并返回一个 Inotify 实例对象。
添加监视目录:使用 inotify_instance.add_watch() 函数将目录添加到 Inotify 实例的监视列表中。
等待事件:使用 inotify_instance.wait() 函数等待 Inotify 实例中的事件。
处理事件:当有新事件到达时,使用 event.is_deleted()、event.is_created()、event.is_moved_from() 和 event.is_moved_to() 方法判断事件类型,并进行相应的处理。
退出 Inotify 实例:使用 inotify_instance.close() 函数退出 Inotify 实例。
通过这些步骤,PyInotify 可以实现对文件系统事件的监视,并在事件发生时触发相应的处理函数。这使得开发者可以方便地实现文件系统监视功能,例如监控某个目录下的文件变化、监控进程的输出等。
WatchDog
什么是watchdog
watchdog 库是一个用于监视文件系统事件的第三方库。它提供了一个 Python API,方便开发者使用。watchdog 库支持跨平台,可以在 Linux、macOS 和 Windows 等操作系统上使用。它提供了多种方式来监视文件系统事件,例如通过回调函数、生成事件队列、异步监视等。使用 watchdog 库,可以方便地实现文件系统监视功能,例如监控某个目录下的文件变化、监控进程的输出等。watchdog 库还支持与 Python 的其他库集成,例如 Django、Flask 等 Web 框架,实现 Web 应用的文件系统监视功能。
安装和使用
我们直接通过Pip库安装吧:
pip install watchdog
然后写个python程序试验一下:
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
class MyHandler(FileSystemEventHandler):
def on_modified(self, event):
print(f"文件 {event.src_path} 被修改")
if __name__ == "__main__":
event_handler = MyHandler()
observer = Observer()
observer.schedule(event_handler, path='listen directory', recursive=False)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
在这个示例中,我们监听的文件夹是程序中'listen directory'这个位置,把这个字符串修改成需要监听的文件夹就行了。实现方式是这样的,我们首先创建一个名为 MyHandler 的类,它继承自 FileSystemEventHandler。然后,我们重写 on_modified 方法,用于处理文件修改事件。当文件被修改时,我们会输出文件的路径。
接下来,我们创建一个 Observer 实例,并使用 schedule 方法注册事件处理器。我们指定要监视的目录路径和处理事件的函数,即 MyHandler 类的 on_modified 方法。
最后,我们启动观察者(observer.start()),并使用一个无限循环来等待事件。在循环中,我们会定期检查是否有新事件。如果有,我们会处理它们。当发生 KeyboardInterrupt 事件时,我们停止观察者(observer.stop()),并等待它完成处理(observer.join())。
这个示例可以通过在命令行中运行 python watchdog_example.py 来启动。例如,如果在命令行中运行 python watchdog_example.py,则程序将监视当前目录下的文件变化,并在控制台输出相应的信息。
watchdog的原理
watchdog 库的原理是通过在文件系统中注册一个监视器来监视文件事件,当有事件发生时,监视器通知 watchdog 库,watchdog 库再将事件传递给注册的观察者。观察者通过实现 FileSystemEventHandler 类的方法来处理文件事件。
PyInotify和WatchDog的区别
PyInotify 和 watchdog 都是用于监视文件系统事件的 Python 库,但它们有一些关键区别:
底层实现:PyInotify 基于 inotify 库,而 watchdog 库基于 inotify 和 kqueue(一个用于监视文件系统事件的 Linux 内核 API)。这意味着 PyInotify 仅支持 Linux 系统,而 watchdog 可以运行在 Linux、macOS 和 Windows 等多个操作系统上。
事件处理方式:PyInotify 使用事件队列的方式处理文件系统事件,而 watchdog 使用回调函数的方式。这意味着 PyInotify 需要手动从事件队列中读取事件并进行处理,而 watchdog 可以在事件发生时直接调用注册的处理器函数。
支持的功能:PyInotify 支持的功能较为简单,主要用于监视目录下的文件事件,包括文件的创建、删除、移动、重命名等。而 watchdog 库支持的功能更为丰富,可以监视文件的读写操作、属性改变、链接改变等。此外,watchdog 还支持监视子进程的输出、日志记录等功能。
使用场景:PyInotify 更适合用于简单的文件系统监视任务,例如监控某个目录下的文件变化。而 watchdog 库的功能更为丰富,适用于更复杂的场景,例如监控进程的输出、监控网络连接等。文章来源:https://uudwc.com/A/8dBkv
总的来说,PyInotify 和 watchdog 都是用于监视文件系统事件的 Python 库,但它们的底层实现、事件处理方式、支持的功能和使用场景等方面存在一些关键区别。开发者可以根据自己的需求选择合适的库来实现文件系统监视功能。文章来源地址https://uudwc.com/A/8dBkv