2015-05-29 10 views
5

Вопрос: How do I watch a file for changes using Python? предлагает использовать сторожевой таймер, но я нашел, что он смог посмотреть только каталог, а не файл. watchdog-test.py приведен пример сценария Watchdog в:Как посмотреть файл, а не каталог изменений с помощью Python?

$ python watchdog-test.py ab_test_res.sh & 
[1] 30628 
[email protected]:~/laike9m$ Traceback (most recent call last): 
    File "watchdog-test.py", line 15, in <module> 
    observer.start() 
    File "/usr/local/lib/python2.7/dist-packages/watchdog/observers/api.py", line 255, in start 
    emitter.start() 
    File "/usr/local/lib/python2.7/dist-packages/watchdog/utils/__init__.py", line 111, in start 
    self.on_thread_start() 
    File "/usr/local/lib/python2.7/dist-packages/watchdog/observers/inotify.py", line 121, in on_thread_start 
    self._inotify = InotifyBuffer(path, self.watch.is_recursive) 
    File "/usr/local/lib/python2.7/dist-packages/watchdog/observers/inotify_buffer.py", line 35, in __init__ 
    self._inotify = Inotify(path, recursive) 
    File "/usr/local/lib/python2.7/dist-packages/watchdog/observers/inotify_c.py", line 187, in __init__ 
    self._add_dir_watch(path, recursive, event_mask) 
    File "/usr/local/lib/python2.7/dist-packages/watchdog/observers/inotify_c.py", line 363, in _add_dir_watch 
    raise OSError('Path is not a directory') 
OSError: Path is not a directory 

Так что лучшее решение? Я использую Linux (Ubuntu 12.04). Кстати, я не хочу использовать опрос.

+1

Какая операционная система? Я не знаю точно, но я думаю, что Windows поддерживает только просмотр каталогов. –

+0

@ColonelThirtyTwo Linux. – laike9m

+3

Загляните в inotify http://linux.die.net/man/7/inotify –

ответ

2

Вы можете посмотреть файл с помощью сторожевого таймера, просмотрев каталог, в котором находится файл, и реагирует только на изменения событий, которые влияют на ваш файл. Что-то, как это будет делать это для вас:

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

class FileModifiedHandler(FileSystemEventHandler): 

    def __init__(self, path, file_name, callback): 
     self.file_name = file_name 
     self.callback = callback 

     # set observer to watch for changes in the directory 
     self.observer = Observer() 
     self.observer.schedule(self, path, recursive=False) 
     self.observer.start() 
     self.observer.join() 

    def on_modified(self, event): 
     # only act on the change that we're looking for 
     if not event.is_directory and event.src_path.endswith(self.file_name): 
      self.observer.stop() # stop watching 
      self.callback() # call callback 


from sys import argv, exit 

if __name__ == '__main__': 

    if not len(argv) == 2: 
     print("No file specified") 
     exit(1) 

    def callback(): 
     print("FILE WAS MODIFED") 

    FileModifiedHandler('.', argv[1], callback) 

я только был в состоянии проверить это на окнах, но она должна быть ОС агностиком.