1

I am running the following code that implements WatchDog in Python to monitor file changes. I am trying to keep track of all the changes in a log file (DoNotDelete.txt), and therefore am trying to ignore this DoNotDelete.txt file within my code. However when I try to run this (first by passing an 'n' to the file and then by changing files) I get a ValueError (ValueError: conflicting patterns set(['*']) included and excluded).

import sys
import time
import os
import logging
from watchdog.observers import Observer
from watchdog.events import PatternMatchingEventHandler

class MyHandler(PatternMatchingEventHandler):

    currentEvent = ""
    update = False

    def on_modified(self, event):
        super(MyHandler, self).on_modified(event)
        what = 'Directory' if event.is_directory else 'File'
        self.currentEvent = what + ", modified, " + event.src_path
        if(self.update == False):
            file = open("DoNotDelete.txt", "a+")
            file.write(self.currentEvent + "\n")
            file.close()
        else:
            print self.currentEvent

    def on_created(self, event):
        super(MyHandler, self).on_created(event)
        what = 'Directory' if event.is_directory else 'File'
        self.currentEvent = what + ", created, " + event.src_path
        if(self.update == False):
            file = open("DoNotDelete.txt", "a+")
            file.write(self.currentEvent + "\n")
            file.close()
        else:
            print self.currentEvent

    def on_deleted(self, event):
        super(MyHandler, self).on_deleted(event)
        what = 'Directory' if event.is_directory else 'File'
        self.currentEvent = what + ", deleted, " + event.src_path
        if(self.update == False):
            file = open("DoNotDelete.txt", "a+")
            file.write(self.currentEvent + "\n")
            file.close()
        else:
            print self.currentEvent

    def on_moved(self, event):
        super(MyHandler, self).on_moved(event)
        what = 'Directory' if event.is_directory else 'File'
        self.currentEvent = what + ", moved, from: " + event.src_path + ", to: " + \ 
        event.dest_path
        if(self.update == False):
            file = open("DoNotDelete.txt", "a+")
            file.write(self.currentEvent + "\n")
            file.close()
        else:
            print self.currentEvent

    def get_boolean(self, bool):
        self.update = bool

if __name__ == "__main__":
    booleanUpdate = False
    updateOrNot = raw_input("Would you like to enable auto-update (y/n): ")
    if((len(updateOrNot) == 1) and (updateOrNot.lower() == "y")):
        booleanUpdate = True
    event_handler = MyHandler(ignore_patterns='*.txt')
    event_handler.get_boolean(booleanUpdate)
    observer = Observer()
    observer.schedule(event_handler, path='.', recursive=True)
    observer.start()
    print booleanUpdate
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()

Any suggestions of how to get around this error?

vrk7bp
  • 75
  • 1
  • 6

1 Answers1

2

I guess you should use a list for the patterns.

class MyHandler(PatternMatchingEventHandler):

  currentEvent = ""
  update = False

  def __init__(self):
      super(MyHandler, self).__init__(ignore_patterns=["*/DoNotDelete.txt"])

  def doExtractMethods(self):
      if (self.update == False):
          file_ = open("DoNotDelete.txt", "a+")
          file_.write(self.currentEvent + "\n")
          file_.close()
      else:
          print self.currentEvent

  def on_modified(self, event):
      super(MyHandler, self).on_modified(event)
      what = 'Directory' if event.is_directory else 'File'
      self.currentEvent = what + ", modified, " + event.src_path
      self.doExtractMethods()

  def on_created(self, event):
      super(MyHandler, self).on_created(event)
      what = 'Directory' if event.is_directory else 'File'
      self.currentEvent = what + ", created, " + event.src_path
      self.doExtractMethods()

  def on_deleted(self, event):
      super(MyHandler, self).on_deleted(event)
      what = 'Directory' if event.is_directory else 'File'
      self.currentEvent = what + ", deleted, " + event.src_path
      self.doExtractMethods()

  def on_moved(self, event):
      super(MyHandler, self).on_moved(event)
      what = 'Directory' if event.is_directory else 'File'
      self.currentEvent = what + ", moved, from: " + event.src_path + ", to: "\
                          + event.dest_path
      self.doExtractMethods()

  def get_boolean(self, bool):
      self.update = bool

Notice ignore_patterns=["*/DoNotDelete.txt"]

See Monitoring a single file and https://github.com/gorakhargosh/watchdog/issues/99

Community
  • 1
  • 1
Mr_and_Mrs_D
  • 32,208
  • 39
  • 178
  • 361
  • hi @Mr_and_Mrs_D , what do i put in `ignore_patterns`, if i want to ignore every file format but ".csv" (my `patterns="*.csv"`)? – Naveen Reddy Marthala Nov 26 '19 at 10:38
  • Did you try `patterns=["*.csv"]` in the [`__init__`](https://pythonhosted.org/watchdog/api.html#watchdog.events.PatternMatchingEventHandler) @NaveenKumar ? – Mr_and_Mrs_D Nov 27 '19 at 08:50
  • yes @Mr_and_Mrs_D , that's what i have in my patterns. i want to monitor only .csv files and ignore every other file format. since you are here, also, will you please be able to help me solve this(same problem with more information): https://stackoverflow.com/questions/59063532/watchdogpython-ignore-every-file-format-but-csv-in-ignore-patterns-in-w – Naveen Reddy Marthala Nov 27 '19 at 09:18