Supongo que su pregunta no incluye la detección de cambios, ya que su muestra solo concierne QgsMapCanvas.refresh()
En cambio tienes que llamar QgsRasterLayer.triggerRepaint()
Si su capa se llama myLayer:
myLayer.setCacheImage( None )
myLayer.triggerRepaint()
El mismo método existe para las capas vectoriales también.
Para una notificación de cambio de archivo de baja sobrecarga, propongo buscar en Qt's QFileSystemWatcher
, que hace uso de inotify en linux y técnicas similares en otras plataformas .
from PyQt4.QtCore import QFileSystemWatcher
def refreshLayer():
myLayer.setCacheImage( None )
myLayer.triggerRepaint()
watcher = QFileSystemWatcher()
watcher.addPath( '/path/to/your/raster' )
watcher.fileChanged.connect( refreshLayer )
Por supuesto, esto se puede combinar con una verificación MD5 según lo propuesto por nickves o una verificación de tiempo de modificación con os.stat
(propuesta de Nathan W).