Cas d'utilisation courants de pickle en Python

134

J'ai regardé la documentation de pickle , mais je ne comprends pas où pickle est utile.

Quels sont les cas d'utilisation courants du cornichon?

satoru
la source
2
La partie que je ne comprends pas au sujet du décapage est pourquoi ne sauvegardez-vous pas simplement la valeur dans un fichier? Pourquoi le décaper?
whackamadoodle3000

Réponses:

59

Quelques utilisations que j'ai rencontrées:

1) sauvegarde des données d'état d'un programme sur le disque afin qu'il puisse continuer là où il s'était arrêté lors du redémarrage (persistance)

2) envoi de données python via une connexion TCP dans un système multicœur ou distribué (marshalling)

3) Stocker des objets Python dans une base de données

4) convertir un objet Python arbitraire en une chaîne afin qu'il puisse être utilisé comme clé de dictionnaire (par exemple pour la mise en cache et la mémorisation).

Il y a quelques problèmes avec le dernier - deux objets identiques peuvent être décapés et donner des chaînes différentes - ou même le même objet mariné deux fois peut avoir des représentations différentes. En effet, le cornichon peut inclure des informations sur le nombre de références.

Pour souligner le commentaire de @ lunaryorn - vous ne devez jamais décoller une chaîne d'une source non fiable, car un pickle soigneusement conçu pourrait exécuter du code arbitraire sur votre système. Par exemple, voir https://blog.nelhage.com/2011/03/exploiting-pickle/

Dave Kirby
la source
27
Il ne faut pas transférer d'objets décapés sur le réseau ou d'autres canaux non approuvés, à moins que les données décapées ne soient soigneusement protégées contre toute manipulation. La documentation pickle avertit explicitement de ne jamais décoller les données de sources non fiables ou non authentifiées.
lunaryorn
4
@lunaryorn: bon point. Si vous allez transférer des données décapées entre des machines, utilisez un canal sécurisé tel que le tunneling SSL ou SSH.
Dave Kirby
3
Ensuite, vous faites toujours confiance au point de terminaison pour ne pas vous exploiter, ce qui peut être acceptable ou non, selon le contexte.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
@lunaryorn - bon point mais dans ce cas, comment pouvons-nous crypter des données dans le domaine public. devons-nous utiliser un autre py lib ou ne pas utiliser de cornichon
Pardeep Sharma
Le point 4) est-il vrai? J'ai trouvé ceci qui a des preuves (anciennes) qui ne fonctionneraient pas ici .
salotz le
10

Exemple aller-retour minimal.

>>> import pickle
>>> a = Anon()
>>> a.foo = 'bar'
>>> pickled = pickle.dumps(a)
>>> unpickled = pickle.loads(pickled)
>>> unpickled.foo
'bar'

Edit: mais en ce qui concerne la question des exemples concrets de décapage, l' utilisation la plus avancée du décapage (vous devrez peut-être creuser assez profondément dans la source) est ZODB: http://svn.zope.org/

Sinon, PyPI en mentionne plusieurs: http://pypi.python.org/pypi?:action=search&term=pickle&submit=search

J'ai personnellement vu plusieurs exemples d'objets marinés envoyés sur le réseau en tant que protocole de transfert réseau facile à utiliser.

Jacob Oscarson
la source
8

Le décapage est absolument nécessaire pour le calcul distribué et parallèle.

Supposons que vous vouliez effectuer une réduction de mappage parallèle avec multiprocessing(ou entre les nœuds de cluster avec pyina ), vous devez vous assurer que la fonction que vous souhaitez mapper sur les ressources parallèles sera pickle. S'il ne se décolore pas, vous ne pouvez pas l'envoyer aux autres ressources sur un autre processus, ordinateur, etc. Voir également ici pour un bon exemple.

Pour ce faire, j'utilise l' aneth , qui peut sérialiser presque tout en python. Dill dispose également de bons outils pour vous aider à comprendre ce qui cause l'échec de votre décapage lorsque votre code échoue.

Et, oui, les gens utilisent le picking pour enregistrer l'état d'un calcul, ou votre session ipython , ou autre.

Mike McKerns
la source
7

Je l'ai utilisé dans l'un de mes projets. Si l'application était arrêtée pendant son fonctionnement (elle effectuait une longue tâche et traitait beaucoup de données), je devais enregistrer toute la structure de données et la recharger après la réexécution de l'application. J'ai utilisé cPickle pour cela, car la vitesse était une chose cruciale et la taille des données était vraiment grande.

taskinoor
la source
4

Pickle est comme "Enregistrer sous .." et "Ouvrir .." pour vos structures de données et vos classes. Disons que je veux sauvegarder mes structures de données afin qu'elles soient persistantes entre les exécutions du programme.

Économie:

with open("save.p", "wb") as f:    
    pickle.dump(myStuff, f)        

Chargement:

try:
    with open("save.p", "rb") as f:
        myStuff = pickle.load(f)
except:
    myStuff = defaultdict(dict)

Maintenant, je n'ai plus besoin de reconstruire myStuff à partir de zéro, et je peux simplement reprendre là où je me suis arrêté.

spartiate
la source
3

Pour le débutant (comme c'est le cas avec moi), il est vraiment difficile de comprendre pourquoi utiliser pickle en premier lieu lors de la lecture de la documentation officielle . C'est peut-être parce que la documentation implique que vous connaissez déjà tout le but de la sérialisation. Ce n'est qu'après avoir lu la description générale de la sérialisation que j'ai compris la raison de ce module et ses cas d'utilisation courants. Des explications générales sur la sérialisation sans tenir compte d'un langage de programmation particulier peuvent également aider: https://stackoverflow.com/a/14482962/4383472 , Qu'est-ce que la sérialisation? , https://stackoverflow.com/a/3984483/4383472

Mauvais
la source
votre "réponse" n'est pas une réponse, c'est plutôt un commentaire. La question du PO est "Quels sont les cas d'utilisation courants du cornichon?". Pensez-vous avoir répondu à cette question d'une manière ou d'une autre?
Mike McKerns
3
eh bien, j'ai l'impression d'avoir répondu à la question car j'ai également eu des difficultés à comprendre les usages courants du cornichon lorsque j'ai essayé de lire sur ce module ici , ici et ici . Parce que la plupart du temps, ils commencent à expliquer ce que fait pickle en supposant que vous connaissez la motivation derrière tout le concept de sérialisation. Après avoir lu un simple article wiki sur la sérialisation, j'ai saisi l'idée générale ainsi que les «cas courants». Peut-être que cela aidera quelqu'un ...
Mauvais
et certains de ces cas courants sont…? S'il y en a qui ne figurent pas ici dans d'autres réponses ... les ajouter à votre réponse serait très approprié.
Mike McKerns
2

Pour ajouter un exemple réel: L' outil de documentation Sphinx pour Python utilise pickle pour mettre en cache les documents analysés et les références croisées entre les documents, afin d'accélérer les versions ultérieures de la documentation.

lunaryorn
la source
1

Je peux vous dire les utilisations pour lesquelles je l'utilise et je l'ai vu utilisé pour:

  • Sauvegarde du profil de jeu
  • Les données de jeu sauvent comme des vies et la santé
  • Enregistrements antérieurs de nombres par exemple saisis dans un programme

Ce sont ceux pour lesquels je l'utilise au moins

Austin Gummy
la source
1

J'utilise le décapage lors de la mise au rebut d'un site Web à ce moment-là, je souhaite stocker plus de 8000k URL et je souhaite les traiter le plus rapidement possible.J'utilise donc le décapage car sa qualité de sortie est très élevée.

vous pouvez facilement accéder à l'URL et où vous arrêtez même le mot clé du répertoire de travail, récupérez également les détails de l'url très rapidement pour reprendre le processus.

Divanshu Tak
la source