Search code examples
pythonseleniumdownloadwatchdog

Trouble getting Watchdog observer to stop/join (python)


I'm using the watchdog python package to detect if a file has been downloaded (which I'm doing in selenium). This is the code I'm using and it successfully detects file creation, but my call to self.observer.stop() doesn't seem to work and the program stalls. Any thoughts?

class MyEventHandler(FileSystemEventHandler):
    def __init__(self, observer):
        self.observer = observer
    def on_created(self, event):
        print "file created"
        self.observer.stop()

def check_download(download_folder):
    file_location = download_folder
    print(download_folder)
    observer = Observer()
    event_handler = MyEventHandler(observer)
    observer.schedule(event_handler, file_location)
    observer.start()
    observer.join()
    return 0

Solution

  • Fixed with:

    class MyEventHandler(FileSystemEventHandler):
        def __init__(self, observer):
            self.observer = observer
    
        def on_created(self, event):
            if not event.src_path.endswith(".pdf"):
                global check
                check = 1  # signal download complete
    
    
    def initiate_download(PDF, download_folder):
        file_location = download_folder
        global check
        check = 0
        observer = Observer()
        event_handler = MyEventHandler(observer)
        observer.schedule(event_handler, file_location)
        observer.start()
        PDF.click()
        while check == 0:
            time.sleep(1)  # wait for download signal
        observer.stop()
        observer.join()
        return 0
    

    Probably not a "proper" solution but it seemed to do the trick.