Salut tout le monde,
Lors de la surveillance d'un dossier dans un QNAP, je peux obtenir des événements pour les fichiers nouvellement créés. Cependant, si le nouveau fichier est un répertoire, le chien de garde se bloque avec une erreur système.
Je soupçonne que c'est parce que le fichier est toujours en cours de copie, mais cela ne devrait pas être une raison pour faire planter l'auditeur.
L'application s'exécute sur Windows 8.1 Pro.
Version du micrologiciel QNAP : 3.7.2 Build 20120719
Trace de la pile:
Exception in thread Thread-3:
Traceback (most recent call last):
File "C:\Python34\lib\threading.py", line 920, in _bootstrap_inner
self.run()
File "C:\Python34\lib\site-packages\watchdog-0.8.3-py3.4.egg\watchdog\observers\api.py", line 146, in run
self.queue_events(self.timeout)
File "C:\Python34\lib\site-packages\watchdog-0.8.3-py3.4.egg\watchdog\observers\read_directory_changes.py", line 77, in queue_events
winapi_events = read_events(self._handle, self.watch.is_recursive)
File "C:\Python34\lib\site-packages\watchdog-0.8.3-py3.4.egg\watchdog\observers\winapi.py", line 347, in read_events
buf, nbytes = read_directory_changes(handle, recursive)
File "C:\Python34\lib\site-packages\watchdog-0.8.3-py3.4.egg\watchdog\observers\winapi.py", line 307, in read_directory_changes
raise e
File "C:\Python34\lib\site-packages\watchdog-0.8.3-py3.4.egg\watchdog\observers\winapi.py", line 303, in read_directory_changes
ctypes.byref(nbytes), None, None)
File "C:\Python34\lib\site-packages\watchdog-0.8.3-py3.4.egg\watchdog\observers\winapi.py", line 108, in _errcheck_bool
raise ctypes.WinError()
OSError: [WinError 58] The specified server cannot perform the requested operation.
Même problème ici, avec une WinError 64 et le message : Le nom de réseau spécifié n'est plus disponible. Cela se produit lorsque le dossier est servi à partir d'un serveur de fichiers qui devient indisponible (partage SMB).
Comment attraper ce genre d'erreur, pour réessayer de rattacher un observateur plus tard ?
Je suis également à la recherche d'une solution pour retarder/réessayer le fil dirwatcher sur :
OSError : [WinError 64] Le nom de réseau spécifié n'est plus disponible
J'ai eu le même problème où je recevais le message WinError 64 lors de la surveillance d'un partage de fichiers distant. J'ai fini par créer un petit wrapper autour de la classe watchdog.utils.BaseThread qui me permet de détecter l'erreur et de la récupérer. J'ai ensuite patché la classe BaseThread d'origine avec mon wrapper avant de créer un observateur. Dans mon cas spécifique, je détecte toutes les exceptions qui pourraient se produire dans la méthode run et les ajoute à une file d'attente à utiliser dans un thread différent. C'est une solution bidon, mais il n'y a pas beaucoup d'options sans modifications du code source.
import logging
import threading
import watchdog.utils
logger = logging.getLogger(__name__)
class BaseThreadWrapper(watchdog.utils.BaseThread):
"""
Wrapper around watchdog BaseThread class.
"""
queue = None
def __init__(self):
super(BaseThreadWrapper, self).__init__()
self._original_run = self.run
self.run = self.run_wrapper
def run_wrapper(self):
try:
self._original_run()
except Exception as e:
logger.exception('%s thread exited with error',
threading.current_thread().name)
self.queue.put(e)
watchdog.utils.BaseThread = BaseThreadWrapper
Quelle solution (changements de code) voudriez-vous voir dans watchdog ?
Commentaire le plus utile
Je suis également à la recherche d'une solution pour retarder/réessayer le fil dirwatcher sur :
OSError : [WinError 64] Le nom de réseau spécifié n'est plus disponible