Starting with release 0.0.21, gamin comes with Python bindings. Use "import gamin"
to load the module. It exports the main class "WatchMonitor"
which handle one connection to the gam_server. Once an instance of the
class has been created you can use the watch_directory and watch_file
methods to register objects to monitors, and provide the callback to be
called when events are generated. Like the FAM API, the python binding
API is passive, i.e. one need to monitor the file
descriptor provided with the get_fd()
method to detect events, and call handle_one_event()
(blocking) or handle_events()
(non-blocking) to process incoming events and get the callbacks
appropriately. You can also use the event_pending()
method to detect if handle_one_event()
would block or not.
Since a short example is worth a thousand words, here is a small
session from the python shell:
>>> import gamin
>>>
>>> def callback(path, event):
... print "Got callback: %s, %s" % (path, event)
...
>>> mon = gamin.WatchMonitor()
>>> mon.watch_directory(".", callback)
<gamin.WatchObject instance at 0xb7f7b56c>
>>> mon.event_pending()
1
>>> mon.handle_one_event()
Got callback: /u/veillard/temp, 8
1
>>> mon.handle_events()
Got callback: bar1, 8
Got callback: foo1, 8
Got callback: /u/veillard/temp, 9
3
>>> mon.stop_watch(".")
>>> del mon
The corresponding standalone code follows: #!/usr/bin/env python
import gamin
import time
def callback(path, event):
print "Got callback: %s, %s" % (path, event)
mon = gamin.WatchMonitor()
mon.watch_directory(".", callback)
time.sleep(1)
ret = mon.event_pending()
if ret > 0:
ret = mon.handle_one_event()
ret = mon.handle_events()
mon.stop_watch(".")
del mon
Note the addition of the sleep timeout, it is needed because due to the round trip between the client and the gam_server, events may not be immediately available after the monitor creation to the client. Daniel Veillard |