Вы можете подклассифицировать обработчик события watchdog.events.PatternMatchingEventHandler и изменить его, чтобы делать все, что хотите, в случае события. Вы должны установить шаблон как имя файла, который вы хотите контролировать.
Однако, это немного сложно. Под обложками используется pathtools.patterns, чтобы выполнить его сопоставление с образцом. И это также добавляет каталог в соответствие шаблону. Это означает, что вам нужно передать в обработчик события полный путь к файлу в качестве вашего имени файла «шаблон» аргумент. Если вы этого не сделаете, соответствие шаблонов не удастся, и вы не получите никаких уведомлений о событиях.
Вот пример ниже:
import sys, os.path, time, logging
from watchdog.observers import Observer
from watchdog.events import PatternMatchingEventHandler
class MyEventHandler(PatternMatchingEventHandler):
def on_moved(self, event):
super(MyEventHandler, self).on_moved(event)
logging.info("File %s was just moved" % event.src_path)
def on_created(self, event):
super(MyEventHandler, self).on_created(event)
logging.info("File %s was just created" % event.src_path)
def on_deleted(self, event):
super(MyEventHandler, self).on_deleted(event)
logging.info("File %s was just deleted" % event.src_path)
def on_modified(self, event):
super(MyEventHandler, self).on_modified(event)
logging.info("File %s was just modified" % event.src_path)
def main(file_path=None):
logging.basicConfig(level=logging.INFO,
format='%(asctime)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S')
watched_dir = os.path.split(file_path)[0]
print 'watched_dir = {watched_dir}'.format(watched_dir=watched_dir)
patterns = [file_path]
print 'patterns = {patterns}'.format(patterns=', '.join(patterns))
event_handler = MyEventHandler(patterns=patterns)
observer = Observer()
observer.schedule(event_handler, watched_dir, recursive=True)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
if __name__ == "__main__":
if len(sys.argv) > 1:
path = sys.argv[1]
main(file_path=path.strip())
else:
sys.exit(1)
Выполнение сценария сторожевой питона (до изменения файла):
(stackoverflow)[[email protected] stackoverflow]# python watchschedule.py /usr/local/src/stackoverflow/watchdog/schedule.xml
watched_dir = /usr/local/src/stackoverflow/watchdog
patterns = /usr/local/src/stackoverflow/watchdog/schedule.xml
Изменение файла schedule.xml в отдельной консоли:
[[email protected] watchdog]# echo "I just modified this file" >> schedule.xml
Результаты после изменения schedule.xml:
(stackoverflow)[[email protected] stackoverflow]# python watchschedule.py /usr/local/src/stackoverflow/watchdog/schedule.xml
watched_dir = /usr/local/src/stackoverflow/watchdog
patterns = /usr/local/src/stackoverflow/watchdog/schedule.xml
2015-08-31 19:30:31 - File /usr/local/src/stackoverflow/watchdog/schedule.xml was just modified
Это работает как рекламируется, спасибо. Как бы я взял необходимость ввода файловой структуры в командной строке? Ничто не работает. Я пробовал три наиболее логичных места в основной функции. –
@ElliotRobert Вы можете жестко указать путь к файлу. В разделе 'if __name__ ==" __main __ ":' удалите весь блок if-else и замените его вызовом функции 'main()', передав ваш hardcoded путь в качестве аргумента 'main()' , Например: 'main (file_path = '/ usr/local/src/stackoverflow/watchdog/schedule.xml')' –
Это работало только для самого каталога, в том числе имя файла, вызвало ошибку, мне пришлось запустить .strip() на полный путь с именем файла для его работы. Спасибо миллиону Джо. –