文件系统事件监控
项目描述
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可以读取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进行安装。
文档
您可以在网上浏览最新版本的文档。
贡献
在GitHub上分叉存储库并发送pull请求,或在问题跟踪器提交问题。对于一般帮助和问题,请使用官方的邮件列表或在stackoverflow上使用标签python-watchdog提问。
创建并激活您的虚拟环境,然后
pip install pytest pip install -e . py.test tests
支持的平台
Linux 2.6 (inotify)
Mac OS X (FSEvents, kqueue)
FreeBSD/BSD (kqueue)
Windows (ReadDirectoryChangesW with I/O completion ports; ReadDirectoryChangesW worker threads)
与OS无关(轮询磁盘以获取目录快照,并定期比较它们;速度慢,不推荐)
请注意,当使用watchdog与kqueue一起使用时,您需要将系统上运行程序可以打开的文件描述符数量增加到您将要监视的文件数量以上。最简单的方法是编辑您的~/.profile文件,并添加类似于以下内容的行
ulimit -n 1024
这是kqueue的固有问题,因为它使用文件描述符来监视文件。加上watchdog需要进行的巨大账簿管理,仅为了监视文件描述符,这使得监视文件和目录的方法变得痛苦。本质上,kqueue不是一种监视深度嵌套的文件和目录(具有大量文件)的好方法。
关于使用Vim等编辑器与watchdog一起使用的问题
除非明确指示,Vim 不会修改文件。它会创建备份文件,然后将其交换以替换磁盘上正在编辑的文件。这意味着如果您使用 Vim 编辑文件,这些文件的修改事件将不会被 watchdog 触发。您可能需要配置 Vim 以禁用此功能。
依赖项
Python 2.6 或更高版本。
select_backport(用于 BSD/Mac OS X 上 2.6 的 select.kqueue 替代品)
XCode(仅限 Mac OS X)
PyYAML(仅用于 watchmedo 脚本)
argh(仅用于 watchmedo 脚本)
许可
Watchdog 在 Apache 许可证 2.0 的条款下授权。
版权所有 2011 Yesudeep Mangalapilly。
版权所有 2012 Google, Inc.
项目源代码可在 Github 上找到。[请在此问题跟踪器报告错误并提交增强请求。]
为什么选择 Watchdog?
太多人尝试做同样的事情,但没有一个人做到我所需要的 Python 的事情。
API 变更
0.8.2
如果 Observer 未已运行,则事件发射器不再按计划启动。
0.8.0
DirectorySnapshot:返回内部状态信息的 mtime、inode 和 path 方法替换了方法。
DirectorySnapshot:废弃了 walker_callback 参数。
项目详情
watchdog-lite-0.0.1.tar.gz 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 971e8dacb401a614d719fc25a20f133281454eb948d247548779098fb53adf64 |
|
MD5 | 50b55e5b55bc6ed3f9ab4c8169a72dce |
|
BLAKE2b-256 | d64483c33d78ce492d671a47dd5cef6b39f0704f6f68d9a630b28dac48fdda48 |