How do I watch a file for changes?

前端 未结 25 2815
孤街浪徒
孤街浪徒 2020-11-21 07:13

I have a log file being written by another process which I want to watch for changes. Each time a change occurs I\'d like to read the new data in to do some processing on it

相关标签:
25条回答
  • 2020-11-21 08:07

    You can also use a simple library called repyt, here is an example:

    repyt ./app.py
    
    0 讨论(0)
  • 2020-11-21 08:10

    This is another modification of Tim Goldan's script that runs on unix types and adds a simple watcher for file modification by using a dict (file=>time).

    usage: whateverName.py path_to_dir_to_watch

    #!/usr/bin/env python
    
    import os, sys, time
    
    def files_to_timestamp(path):
        files = [os.path.join(path, f) for f in os.listdir(path)]
        return dict ([(f, os.path.getmtime(f)) for f in files])
    
    if __name__ == "__main__":
    
        path_to_watch = sys.argv[1]
        print('Watching {}..'.format(path_to_watch))
    
        before = files_to_timestamp(path_to_watch)
    
        while 1:
            time.sleep (2)
            after = files_to_timestamp(path_to_watch)
    
            added = [f for f in after.keys() if not f in before.keys()]
            removed = [f for f in before.keys() if not f in after.keys()]
            modified = []
    
            for f in before.keys():
                if not f in removed:
                    if os.path.getmtime(f) != before.get(f):
                        modified.append(f)
    
            if added: print('Added: {}'.format(', '.join(added)))
            if removed: print('Removed: {}'.format(', '.join(removed)))
            if modified: print('Modified: {}'.format(', '.join(modified)))
    
            before = after
    
    0 讨论(0)
  • 2020-11-21 08:11

    If you want a multiplatform solution, then check QFileSystemWatcher. Here an example code (not sanitized):

    from PyQt4 import QtCore
    
    @QtCore.pyqtSlot(str)
    def directory_changed(path):
        print('Directory Changed!!!')
    
    @QtCore.pyqtSlot(str)
    def file_changed(path):
        print('File Changed!!!')
    
    fs_watcher = QtCore.QFileSystemWatcher(['/path/to/files_1', '/path/to/files_2', '/path/to/files_3'])
    
    fs_watcher.connect(fs_watcher, QtCore.SIGNAL('directoryChanged(QString)'), directory_changed)
    fs_watcher.connect(fs_watcher, QtCore.SIGNAL('fileChanged(QString)'), file_changed)
    
    0 讨论(0)
  • 2020-11-21 08:12

    Seems that no one has posted fswatch. It is a cross-platform file system watcher. Just install it, run it and follow the prompts.

    I've used it with python and golang programs and it just works.

    0 讨论(0)
  • 2020-11-21 08:13

    Check out pyinotify.

    inotify replaces dnotify (from an earlier answer) in newer linuxes and allows file-level rather than directory-level monitoring.

    0 讨论(0)
  • 2020-11-21 08:13

    Since I have it installed globally, my favorite approach is to use nodemon. If your source code is in src, and your entry point is src/app.py, then it's as easy as:

    nodemon -w 'src/**' -e py,html --exec python src/app.py
    

    ... where -e py,html lets you control what file types to watch for changes.

    0 讨论(0)
提交回复
热议问题