前言 {#%E5%89%8D%E8%A8%80}
经常需要实时监控文件系统的变化,以便能够及时进行增量处理 。在这方面,Python 提供了两个卓越的第三方开源工具:watchdog
和 pyinotify
。
虽然可以通过轮询的方式监控文件系统,但这种方法效率低下,且不够优雅。因此,强烈推荐使用 watchdog
或 pyinotify
进行监控。
watchdog {#watchdog}
watchdog是一个Python库,用于监控文件系统事件。它可以监控文件和目录的创建、删除、修改等事件,并且跨平台兼容(Windows、macOS、Linux)。
以下是使用watchdog
进行文件系统监控的基本步骤:
- 安装
watchdog
: 首先,你需要安装watchdog
。这可以通过pip完成:
pip install watchdog
- 编写监控脚本: 使用
watchdog
的事件处理器和观察者来监控文件系统事件。
以下是一个简单的示例,它监控指定目录中的所有文件更改:
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import time
class Watcher:
DIRECTORY_TO_WATCH = "/path/to/my/directory"
def __init__(self):
self.observer = Observer()
def run(self):
event_handler = Handler()
self.observer.schedule(event_handler, self.DIRECTORY_TO_WATCH, recursive=True)
self.observer.start()
try:
while True:
time.sleep(5)
except:
self.observer.stop()
print("Observer Stopped")
self.observer.join()
class Handler(FileSystemEventHandler):
@staticmethod
def on_any_event(event):
if event.is_directory:
return None
elif event.event_type == 'created':
# 文件创建
print(f"Received created event - {event.src_path}.")
elif event.event_type == 'modified':
# 文件修改
print(f"Received modified event - {event.src_path}.")
`if `name` == '`main`':
w = Watcher()
w.run()`
在这个示例中,我们创建了一个Watcher
类来初始化和运行监视器,以及一个Handler
类来处理不同的文件系统事件。你可以根据需要修改DIRECTORY_TO_WATCH
来监控不同的目录,并根据事件类型(如文件创建、修改)实现不同的逻辑。
请确保将"/path/to/my/directory"
替换为你想监控的实际目录路径。
watchdog 事件 {#watchdog-事件}
| watchdog 事件 | 描述 | |------------------------|-----------| | FileSystemEventHandler | 文件系统事件的基类 | | FileModifiedEvent | 文件被修改时触发 | | FileCreatedEvent | 创建文件时触发 | | FileDeletedEvent | 删除文件时触发 | | FileMovedEvent | 移动文件时触发 | | DirModifiedEvent | 目录被修改时触发 | | DirCreatedEvent | 创建目录时触发 | | DirDeletedEvent | 删除目录时触发 | | DirMovedEvent | 移动目录时触发 |
pyinotify {#pyinotify}
pyinotify 是一个 Python 库,用于监控文件系统事件,但它仅适用于 Linux 操作系统。它利用了 Linux 内核的 inotify 机制来监控文件和目录的变化,如创建、删除、修改等。
如果你正在使用 Linux 系统并且想使用 pyinotify
进行文件系统监控,可以按照以下步骤操作:
- 安装 pyinotify: 使用 pip 安装 pyinotify:
pip install pyinotify
- 编写监控脚本: 创建一个脚本来监控文件系统事件。以下是一个基本示例:
import pyinotify
class MyEventHandler(pyinotify.ProcessEvent):
def process_IN_CREATE(self, event):
print(f"创建文件: {event.pathname}")
def process_IN_DELETE(self, event):
print(f"删除文件: {event.pathname}")
def process_IN_MODIFY(self, event):
print(f"修改文件: {event.pathname}")
def main():
# 监控的路径
path_to_watch = "/path/to/watch"
# 设置事件掩码(监控文件创建、删除和修改)
mask = pyinotify.IN_CREATE | pyinotify.IN_DELETE | pyinotify.IN_MODIFY
wm = pyinotify.WatchManager()
handler = MyEventHandler()
notifier = pyinotify.Notifier(wm, handler)
wdd = wm.add_watch(path_to_watch, mask, rec=True)
notifier.loop()
`if `name` == "`main`":
main()`
在这个脚本中,我们定义了一个事件处理器 MyEventHandler
,它继承自 pyinotify.ProcessEvent
并重写了几个方法来处理不同类型的事件(如文件创建、删除和修改)。然后在主函数中,我们创建了一个 pyinotify.WatchManager
实例,并添加了一个监控路径。
确保将 "/path/to/watch"
替换为你想监控的实际目录路径。
请注意,pyinotify 仅在 Linux 系统上工作。如果你需要跨平台解决方案,watchdog 是更好的选择。
pyinotify 事件 {#pyinotify-事件}
| pyinotify 事件 | 描述 | |------------------|-----------------| | 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_DELETE_SELF | 监控的目录本身被删除时触发 | | IN_MOVE_SELF | 监控的目录本身被移动时触发 |
二者区别 {#%E4%BA%8C%E8%80%85%E5%8C%BA%E5%88%AB}
| 特性/库 | pyinotify | watchdog | |-----------|-----------------------|----------------------------| | 平台兼容性 | 仅支持 Linux | 跨平台(Linux, macOS, Windows) | | 底层机制 | 使用 Linux 的 inotify 接口 | 使用操作系统的本地文件监控机制 | | 易用性 | 直接和简单 | 直接,但具有更多的配置选项 | | 性能 | 高(直接使用内核级别的通知) | 取决于操作系统和配置 | | 用途 | 专注于 Linux 文件系统的监控 | 适用于需要跨平台文件监控的应用 | | 安装 | 通过 pip 安装 | 通过 pip 安装 | | 自定义处理 | 支持通过事件处理器定制处理 | 支持通过事件处理器定制处理 | | 社区支持 | 有限 | 较广泛 |