跳转到主要内容

原生和虚拟文件系统事件监控

项目描述

Python API和shell实用工具用于监控文件系统事件。

API使用示例

一个简单的程序,使用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 '.'
    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()

Shell实用工具

Watchdog附带了一个名为watchmedo的实用脚本。请在shell提示符下输入watchmedo --help以了解更多关于此工具的信息。

以下是如何递归地记录当前目录的事件,这些事件仅与*.py*.txt文件相关,同时忽略所有目录事件

watchmedo log \
    --patterns="*.py;*.txt" \
    --ignore-directories \
    --recursive \
    .

您可以使用shell-command子命令在响应事件时执行shell命令

watchmedo shell-command \
    --patterns="*.py;*.txt" \
    --recursive \
    --command='echo "${watch_src_path}"' \
    .

请通过输入来查看这些命令的帮助信息

watchmedo [command] --help

网络驱动器和虚拟机

存在一些情况,当挂载的文件系统不同时,watchmedo 的自动配置可能会出错。

尽管 watchmedo log 具有强制显式轮询的选项,但这并不适用于其他子命令。

特别是在 Linux/Os X 主机上的 Windows 虚拟机不会接收到任何事件,但使用轮询会得到许多虚假事件。原因是虚拟化的 inode 信息是伪造的,并且经常变化。

为了使所有子命令都能正常工作,有一个具有相同选项的替代 watchmount 命令,例如:

watchmount shell-command \
    --patterns="*.py;*.txt" \
    --recursive \
    --command='echo "${watch_src_path}"' \
    .

自动检测某些网络连接的最佳处理方法是后续版本的一个非平凡话题……

关于 watchmedo 小技巧

watchmedo 可以读取 tricks.yaml 文件,并在响应文件系统事件时执行其中的技巧。技巧实际上是子类化 watchdog.tricks.Trick 的事件处理器,由插件作者编写。技巧类增加了一些常规事件处理器不需要的附加功能。

一个示例 tricks.yaml 文件

tricks:
- watchdog.tricks.LoggerTrick:
    patterns: ["*.py", "*.js"]
- watchmedo_webtricks.GoogleClosureTrick:
    patterns: ['*.js']
    hash_names: true
    mappings_format: json                  # json|yaml|python
    mappings_module: app/javascript_mappings
    suffix: .min.js
    compilation_level: advanced            # simple|advanced
    source_directory: app/static/js/
    destination_directory: app/public/js/
    files:
      index-page:
      - app/static/js/vendor/jquery*.js
      - app/static/js/base.js
      - app/static/js/index-page.js
      about-page:
      - app/static/js/vendor/jquery*.js
      - app/static/js/base.js
      - app/static/js/about-page/**/*.js

包含 tricks.yaml 文件的目录将被监控。每个技巧类都使用 tricks.yaml 文件中对应的键作为参数进行初始化,并且当事件到达时,将这些事件传递给该类的实例。

技巧将在 0.5.0 版本中包含。我需要社区对这些技巧的反馈。请在 问题跟踪器 中提交增强请求。

安装

使用 pip 从 PyPI 安装

pip install watchdog

使用 easy_install 从 PyPI 安装

easy_install watchdog

从源代码安装

python setup.py install

安装注意事项

watchmedo 脚本依赖于 PyYAML,它链接到 LibYAML,这为 PyYAML 解析器带来了性能提升。然而,安装 LibYAML 是可选的但建议这么做。在 Mac OS X 上,您可以使用 homebrew 安装 LibYAML

brew install libyaml

在 Linux 上,使用您喜欢的包管理器安装 LibYAML。以下是在 Ubuntu 上如何操作的方法

sudo aptitude install libyaml-dev

在 Windows 上,请使用他们提供的二进制文件使用 PyYAML 安装。

文档

您可以在网上浏览最新版本的 文档

支持的平台

  • Linux 2.6 (inotify)

  • Mac OS X (FSEvents, kqueue)

  • FreeBSD/BSD (kqueue)

  • Windows (ReadDirectoryChangesW 与 I/O 完成端口;ReadDirectoryChangesW 工作线程)

  • 与操作系统无关(轮询磁盘以获取目录快照并定期比较;速度慢,不推荐使用)

请注意,当使用 watchdog 与 kqueue 一起时,您需要将系统上运行的程序允许打开的文件描述符数量增加到要监控的文件数量以上。最简单的方法是编辑您的 ~/.profile 文件并添加类似以下的一行

ulimit -n 1024

这是 kqueue 的固有问题,因为它使用文件描述符来监控文件。再加上 watchdog 需要执行的大量账本工作,以便监控文件描述符,这使监控文件和目录变得非常痛苦。本质上,kqueue 不是监控大量文件和目录的深层嵌套目录的好方法。

关于使用 watchdog 与 Vim 等编辑器一起使用的问题

vim在未明确指示的情况下不会修改文件。它会创建备份文件,然后将其交换以替换磁盘上正在编辑的文件。这意味着如果您使用vim编辑文件,这些文件的修改事件不会被watchdog触发。您可能需要适当配置vim来禁用此功能。

依赖项

  1. Python 2.5或更高版本。

  2. pathtools

  3. select_backport(Python2.5/2.6在BSD/Mac OS X上的kqueue替代品)

  4. XCode(仅在Mac OS X上)

  5. PyYAML(仅用于watchmedo脚本)

  6. argh(仅用于watchmedo脚本)

许可

Watchdog根据Apache License,版本2.0条款授权。

版权所有2011 Yesudeep Mangalapilly

版权所有2012 Google,Inc。

项目源代码可在GitHub上获得。源代码。请在问题跟踪器中报告错误并提交增强请求。

为什么选择Watchdog?

太多人试图做同样的事情,但没有一个人能做我想让Python做的事情

项目详情


下载文件

下载适合您平台文件的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

pydica-watchdog-0.6.2.tar.gz (83.4 kB 查看哈希值

上传时间

支持者