I suppose your question does not include change detection, as your sample only concerns QgsMapCanvas.refresh()QgsMapCanvas.refresh()
Instead you have to call QgsRasterLayer.triggerRepaint()QgsRasterLayer.triggerRepaint()
If your layer is called myLayer:
myLayer.setCacheImage( None )
myLayer.triggerRepaint()
The same method exists for vector layers as well.
For low overhead file change notification I'd propose looking into Qt's QFileSystemWatcherQFileSystemWatcher
, which makes use of inotify on linux and similar techniques on other platforms.
from PyQt4.QtCore import QFileSystemWatcher
def refreshLayer():
myLayer.setCacheImage( None )
myLayer.triggerRepaint()
watcher = QFileSystemWatcher()
watcher.addPath( '/path/to/your/raster' )
watcher.fileChanged.connect( refreshLayer )
Of course this can be combined with an MD5 check as proposed by nickves or a modification time check with os.stat
(Nathan W proposal).