Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

ValueError: unsupported pickle protocol: 3

+4 votes

je viens d'installer redis (2.8) et une application maison au boulot, utilisant django (1.8.8) / django-redis (4.3.0) / celery (3.1.19)

au lancement de

celery -A monprojet beat -l info

j'ai droit à :

[2016-01-14 11:02:56,649: CRITICAL/MainProcess] beat raised exception <type 'exceptions.ValueError'>: ValueError('unsupported pickle protocol: 3',)
Traceback (most recent call last):
  File "[...]/lib/python2.7/site-packages/celery/apps/beat.py", line 112, in start_scheduler
    beat.start()
  File "[...]/lib/python2.7/site-packages/celery/beat.py", line 464, in start
    humanize_seconds(self.scheduler.max_interval))
  File "[...]/lib/python2.7/site-packages/kombu/utils/__init__.py", line 325, in __get__
    value = obj.__dict__[self.__name__] = self.__get(obj)
  File "[...]/lib/python2.7/site-packages/celery/beat.py", line 504, in scheduler
    return self.get_scheduler()
  File "[...]/lib/python2.7/site-packages/celery/beat.py", line 499, in get_scheduler
    lazy=lazy)
  File "[...]/lib/python2.7/site-packages/celery/utils/imports.py", line 53, in instantiate
    return symbol_by_name(name)(*args, **kwargs)
  File "[...]/lib/python2.7/site-packages/celery/beat.py", line 358, in __init__
    Scheduler.__init__(self, *args, **kwargs)
  File "[...]/lib/python2.7/site-packages/celery/beat.py", line 185, in __init__
    self.setup_schedule()
  File "[...]/lib/python2.7/site-packages/celery/beat.py", line 382, in setup_schedule
    self._store['entries']
  File "/usr/lib64/python2.7/shelve.py", line 122, in __getitem__
    value = Unpickler(f).load()
ValueError: unsupported pickle protocol: 3

ceci se produit sur une centos 6.7 avec python 2.7.11 mais pas du tout sur ma debian 8 avec python 2.7.9 avec les memes composants

j'ai eu beau mettre dans mon settings.py :

CELERY_ACCEPT_CONTENT = ["json",  "msgpack",  "yaml"]
CELERY_EVENT_SERIALIZER = "json"
CELERY_RESULT_SERIALIZER = "json"
CELERY_TASK_SERIALIZER =  "json"

ca n'a pas suffit à ce que pickle soit "oublié" de ces histoires
dans le doute j'ai fait un

celery -A monprojet inspect conf 

et je retrouve bien mes petits :

    "CELERY_ACCEPT_CONTENT": [
        "json", 
        "msgpack", 
        "yaml"
    ], 
    "CELERY_EVENT_SERIALIZER": "json", 
    "CELERY_RESULT_SERIALIZER": "json", 
    "CELERY_TASK_SERIALIZER": "json", 

mais rien y fait .

Je ne comprends pas pourquoi python persiste à me sortir des erreur sur Pickle alors que j'en veux pas.

Une suggestion ?

demandé 14-Jan-2016 par foxmask (2,670 points)

D'après le traceback, l'erreur semble provenir du module shelve, qui utilise pickle pour la sérialisation des valeurs. Ça vient du sheduler par défaut de celery.

Sinon, ce que je ne comprend pas, c'est pourquoi la version 3 de pickle est employée alors que tu es sur python 2. Que se passe t'il si tu importe shelve directement depuis python ?

Je regarderai tout à l'heure. Si ça se trouve il est pas content parce que je lance beat mais j'ai (encore) rien mis dans le settings niveau crontab

1 Réponse

+2 votes
 
Meilleure réponse

J'ai lâché python 2.7.11 pour python 3.5 et je n'ai AUCUNE ERREUR ...
et ce, sans changer une ligne de code .

répondu 15-Jan-2016 par foxmask (2,670 points)
sélectionné 15-Jan-2016 par foxmask

Merci pour le retour.

...