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.
Je m'attends à pouvoir décaper les objets DirectorySnapshot, comme je peux le faire dans la dernière version, 0.9.0.
Je ne peux pas décaper un DirectorySnapshot car je reçois une PicklingError.
Cela n'arrive pas sur la version 0.9.0.
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"))
master
. Actuellement 7a55f317946953d86a5acea64d9b31931ca25307
.src
, pas la version pypi.import pickle
from src.watchdog.utils.dirsnapshot import DirectorySnapshot
pickle.dumps(DirectorySnapshot("/Users/alex/tmp"))
_pickle.PicklingError: Can't pickle <function DirectorySnapshot.<lambda> at 0x10dfb20d0>: attribute lookup DirectorySnapshot.<lambda> on src.watchdog.utils.dirsnapshot failed
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.
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
.
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 :)