blob: 3d8c9ec12376a601dd3f8c65f8e0f8cab2767819 [file] [log] [blame]
Watchdog
========
Python API and shell utilities to monitor file system events.
Example API Usage:
------------------
A simple program that uses watchdog to monitor directories specified
as command-line arguments and logs events generated.
import sys
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import logging
logging.basicConfig(level=logging.DEBUG)
class MyEventHandler(FileSystemEventHandler):
def catch_all_handler(self, event):
logging.debug(event)
def on_moved(self, event):
self.catch_all_handler(event)
def on_created(self, event):
self.catch_all_handler(event)
def on_deleted(self, event):
self.catch_all_handler(event)
def on_modified(self, event):
self.catch_all_handler(event)
path = sys.argv[1]
event_handler = MyEventHandler()
observer = Observer()
observer.schedule(event_handler, path, recursive=True)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
Shell Utilities:
----------------
Watchdog comes with a utility script called `watchmedo`.
Please type `watchmedo --help` at the shell prompt to
know more about this tool.
Here is how you can log the current directory recursively
for events related only to `*.py` and `*.txt` files while
ignoring all directory events:
watchmedo log --patterns="*.py;*.txt" --ignore-directories --recursive .
If you'd like to execute shell commands in response to
events you can use the `shell-command` subcommand like this:
watchmedo shell-command --patterns="*.py;*.txt" --recursive --command='echo "${watch_src_path}"' .
Please see the help information for these commands by typing:
watchmedo [command] --help
### About `watchmedo` Tricks:
Watchmedo can read "tricks.yaml" files and execute tricks
within them in response to file system events. Tricks are
basically FileSystemEventHandlers that plugin authors can
write. Trick classes are augmented with a few additional
features that regular event handlers don't need.
An example `tricks.yaml` file:
python-path: [app, foobar/bin, whatever/another/directory]
watches:
- app/static
tricks:
- watchdog.tricks.LoggerTrick:
kwargs:
patterns: ["*.py"]
ignore_patterns: ["*.pyc", "*.pyo"]
ignore_directories: True
- watchmedo_webtricks.GoogleClosureTrick:
kwargs:
patterns: ['app/static/js/*.js']
hash_names: true
mappings_module: app/javascript_mappings.py
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
Each trick class is initialized with the given kwargs
keyword arguments and events are fed to an instance of
the class as they arrive.
Tricks will be included in the 0.4.0 release. I need community
input about them. Please file enhancement requests at the
[issue tracker](http://github.com/gorakhargosh/watchdog/issues').
Installation:
-------------
Installing from PyPI using pip:
pip install watchdog
Installing from PyPI using easy_install:
easy_install watchdog
Installing from source:
python setup.py install
Supported Platforms:
--------------------
* Linux 2.6 (inotify)
* Mac OS X (FSEevnts, kqueue)
* FreeBSD/BSD (kqueue)
* Windows (ReadDirectoryChangesW with I/O completion ports; ReadDirectoryChangesW worker threads)
* OS-independent (polling the disk for directory snapshots and comparing them periodically; slow and not recommended)
Dependencies:
-------------
1. Python 2.5 or above.
2. [pywin32](http://sourceforge.net/projects/pywin32/) (only on Windows)
3. [pyinotify](http://github.com/seb-m/pyinotify) (only on Linux)
4. [XCode](http://developer.apple.com/technologies/tools/xcode.html) or gcc (only on Mac OS X)
5. [PyYAML](http://www.pyyaml.org/)
6. [argh](http://pypi.python.org/pypi/argh)
7. [select_backport](http://pypi.python.org/pypi/select_backport/) (select.kqueue replacement for Python2.5/2.6 on BSD/Mac OS X)
Licensing:
----------
Watchdog is licensed under the terms of the
[MIT License](http://www.opensource.org/licenses/mit-license.html)
Copyright (C) 2010 Gora Khargosh <[gora.khargosh@gmail.com](mailto:gora.khargosh@gmail.com)> and the Watchdog authors.
Project source code at [Github](http://github.com/gorakhargosh/watchdog)
Please report bugs at the [Github issue tracker](http://github.com/gorakhargosh/watchdog/issues).
Why Watchdog?
-------------
Too many people tried to do the same thing and none did
what I needed Python to do:
* [pnotify](http://mark.heily.com/pnotify/)
* [unison fsmonitor](https://webdav.seas.upenn.edu/viewvc/unison/trunk/src/fsmonitor.py?view=markup&pathrev=471)
* [fsmonitor](http://github.com/shaurz/fsmonitor)
* [guard](http://github.com/guard/guard)
* [pyinotify](http://github.com/seb-m/pyinotify)
* [inotify-tools](http://github.com/rvoicilas/inotify-tools)
* [jnotify](http://jnotify.sourceforge.net/)
* [treewalker](http://github.com/jbd/treewatcher)
* [file.monitor](http://github.com/pke/file.monitor)