Watchdog: Impossible de décaper les instantanés d'annuaire

Créé le 4 déc. 2019  ·  4Commentaires  ·  Source: gorakhargosh/watchdog

Tout d'abord, je ne sais pas s'il s'agit d'un problème, d'un comportement attendu ou simplement d'un scénario qui n'est pas destiné à être résolu.

Comportement prévisible

Je m'attends à pouvoir décaper les objets DirectorySnapshot, comme je peux le faire dans la dernière version, 0.9.0.

Comportement actuel

Je ne peux pas décaper un DirectorySnapshot car je reçois une PicklingError.
Cela n'arrive pas sur la version 0.9.0.

Solution possible

Une solution de contournement possible consiste à utiliser la bibliothèque dill et cela fonctionnerait, mais je trouve étrange de ne pas la faire fonctionner avec pickle comme avant car elle casse le code existant.

Les travaux suivants :

import dill
from src.watchdog.utils.dirsnapshot import DirectorySnapshot

dill.dumps(DirectorySnapshot("/Users/alex/tmp"))

Étapes pour reproduire

  1. Clonez le dépôt avec le dernier commit master . Actuellement 7a55f317946953d86a5acea64d9b31931ca25307 .
  2. Essayez de décaper un DirectorySnapshot. Notez l'importation depuis le répertoire src , pas la version pypi.
import pickle
from src.watchdog.utils.dirsnapshot import DirectorySnapshot

pickle.dumps(DirectorySnapshot("/Users/alex/tmp"))
  1. Vous verrez l'exception suivante :
_pickle.PicklingError: Can't pickle <function DirectorySnapshot.<lambda> at 0x10dfb20d0>: attribute lookup DirectorySnapshot.<lambda> on src.watchdog.utils.dirsnapshot failed

Contexte (Environnement)

Je suis confronté à ce problème lorsque j'utilise à la fois python 3.7 et python 3.8 dans un macOS Mojave 10.14.6.

Dans mon scénario, je dois décaper un objet DirectorySnapshot pour le comparer plus tard avec l'instantané actuel et voir s'il y a eu un changement pendant que mon programme était en panne.

Mise en œuvre possible

Je propose juste de le faire fonctionner avec pickle . Peut-être que le lambda problématique n'est pas requis et nous pouvons simplement éviter de le sérialiser en utilisant __getstate__ .

Sinon, il n'y a tout simplement pas de solution et nous devons utiliser la bibliothèque dill .

bug

Tous les 4 commentaires

Merci pour le reportage @Ajordat :)


L'utilisation de git bisect montre que le commit qui a introduit l'erreur est ecaa92756fe78d4771d23550c0935b0190769035 : Instantané : ne parcourez pas les répertoires sans autorisations de lecture (#573).

@danilobellini Si je supprime l'argument walker_callback , cela fonctionne. Comme cet argument est déprécié depuis la 0.7.2, il est peut-être aussi temps de le supprimer, WDYT ?

OMI si une fonctionnalité obsolète cause des problèmes, elle doit être supprimée.

Ce que je ne sais pas, c'est que s'il est obsolète depuis la 0.7.2, pourquoi cela n'a posé aucun problème sur la 0.9.0 et les cause maintenant ?

Car avec le commit ecaa927 le lambda est maintenant assigné à un attribut de la classe. Cela cause des problèmes avec le cornichon. Je vais ouvrir un PR pour supprimer le code obsolète :)

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

datakurre picture datakurre  ·  7Commentaires

alt3red picture alt3red  ·  3Commentaires

mccarthyryanc picture mccarthyryanc  ·  5Commentaires

fx86 picture fx86  ·  3Commentaires

AndreaCrotti picture AndreaCrotti  ·  3Commentaires