[Python] Why is watchdog event-handler trying to open every new file?

Discussão em 'Python' iniciado por Stack, Julho 10, 2025.

  1. Stack

    Stack Membro Participativo

    The simple directory-watching script is below:

    import logging
    import sys
    import time

    from watchdog.events import FileSystemEventHandler
    from watchdog.observers import Observer

    class MyEventHandler(FileSystemEventHandler):
    def __init__(self, observer, log):
    self.log = log
    self.observer = observer

    def on_created(self, event):
    self.log.info("%s", event)

    def main(argv):
    logging.basicConfig(format = '%(asctime)s %(levelname)-8s %(message)s',
    datefmt = '%Y-%m-%d %H:%M:%S',
    level = logging.DEBUG)
    log = logging.getLogger(__name__)
    path = argv[1]
    observer = Observer()
    log.debug('Created observer %s', observer)
    event_handler = MyEventHandler(observer, log)
    observer.schedule(event_handler, path, recursive = False)
    observer.start()
    observer.join()
    return 0

    if __name__ == "__main__":
    sys.exit(main(sys.argv))


    Started as something like ./fpounce.py /tmp it works, but the observer-thread crashes as soon as a file is created in the watched directory (/tmp) by some other user (such as the www):

    2025-07-09 14:30:41 DEBUG Created observer <KqueueObserver(Thread-1, initial daemon)>
    2025-07-09 14:30:42 INFO FileCreatedEvent(src_path='/tmp/sess_e645f55f69770d25a08b8210245510f6', dest_path='', event_type='created', is_directory=False, is_synthetic=False)
    Exception in thread Thread-2:
    Traceback (most recent call last):
    File "/opt/lib/python3.11/threading.py", line 1045, in _bootstrap_inner
    self.run()
    File "/opt/lib/python3.11/site-packages/watchdog/observers/api.py", line 158, in run
    self.queue_events(self.timeout)
    File "/opt/lib/python3.11/site-packages/watchdog/observers/kqueue.py", line 630, in queue_events
    self.queue_event(FileCreatedEvent(file_created))
    File "/opt/lib/python3.11/site-packages/watchdog/observers/kqueue.py", line 481, in queue_event
    self._register_kevent(event.src_path, is_directory=event.is_directory)
    File "/opt/lib/python3.11/site-packages/watchdog/observers/kqueue.py", line 435, in _register_kevent
    self._descriptors.add(path, is_directory=is_directory)
    File "/opt/lib/python3.11/site-packages/watchdog/observers/kqueue.py", line 215, in add
    self._add_descriptor(KeventDescriptor(path, is_directory=is_directory))
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "/opt/lib/python3.11/site-packages/watchdog/observers/kqueue.py", line 294, in __init__
    self._fd = os.open(path, WATCHDOG_OS_OPEN_FLAGS)
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    PermissionError: [Errno 13] Permission denied: '/tmp/sess_e645f55f69770d25a08b8210245510f6'


    Why is it trying to open the newly-created files? Can I disable this somehow -- or make failures non-fatal?

    Update: Just tested the same code on Linux -- no problem there with inotify. Must be something about kqueue watchdog-implementation in particular -- will have to file a bug-report, I suppose.

    Continue reading...

Compartilhe esta Página