79 votes

Comment résoudre le problème "AttributeError : module 'google.protobuf.descriptor' has no attribute '_internal_create_key" ?

Je l'ai rencontré en exécutant from object_detection.utils import label_map_util dans le carnet de notes de Jupyter. Il s'agit en fait du tensorflow object detection tutorial notebook (il est livré avec l'api tensorflow object detection). Le journal d'erreur complet :

AttributeError                            Traceback (most recent call last)
<ipython-input-7-7035655b948a> in <module>
      1 from object_detection.utils import ops as utils_ops
----> 2 from object_detection.utils import label_map_util
      3 from object_detection.utils import visualization_utils as vis_util

~\AppData\Roaming\Python\Python37\site-packages\object_detection\utils\label_map_util.py in <module>
     25 import tensorflow as tf
     26 from google.protobuf import text_format
---> 27 from object_detection.protos import string_int_label_map_pb2
     28 
     29 

~\AppData\Roaming\Python\Python37\site-packages\object_detection\protos\string_int_label_map_pb2.py in <module>
     19   syntax='proto2',
     20   serialized_options=None,
---> 21   create_key=_descriptor._internal_create_key,
     22   serialized_pb=b'\n2object_detection/protos/string_int_label_map.proto\x12\x17object_detection.protos\"\xc0\x01\n\x15StringIntLabelMapItem\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\x05\x12\x14\n\x0c\x64isplay_name\x18\x03 \x01(\t\x12M\n\tkeypoints\x18\x04 \x03(\x0b\x32:.object_detection.protos.StringIntLabelMapItem.KeypointMap\x1a(\n\x0bKeypointMap\x12\n\n\x02id\x18\x01 \x01(\x05\x12\r\n\x05label\x18\x02 \x01(\t\"Q\n\x11StringIntLabelMap\x12<\n\x04item\x18\x01 \x03(\x0b\x32..object_detection.protos.StringIntLabelMapItem'
     23 )

AttributeError: module 'google.protobuf.descriptor' has no attribute '_internal_create_key'

166voto

Reghunaath A A Points 2310

La version du protocole que j'ai obtenue par pip show protobuf y protoc --version étaient différentes. La version en pip était un peu dépassée.

Après avoir mis à jour la version de pip avec

pip install --upgrade protobuf

le problème était résolu.

2 votes

Si python3, utilisez pip3 install --upgrade protobuf .

44voto

analyst045 Points 510

Ces trois commandes ont résolu le problème pour moi :

pip uninstall protobuf python3-protobuf
pip install --upgrade pip
pip install --upgrade protobuf

6 votes

Dans mon cas, je n'ai eu qu'à mettre à jour pip et protobuf (dans l'environnement virtuel) à partir de 3.11.3 a 3.13.0

0 votes

La simple mise à jour de protobuf de 3.11.2 à 3.13.0 a été suffisante pour moi.

1 votes

Cela fonctionne aussi pour moi. Bien que j'aie mis à jour protobuf, cela n'a pas fonctionné. Ensuite, j'exécute le commentaire suivant pip uninstall protobuf python3-protobuf et ça a marché. Merci !

2voto

Matt Key Points 71

Pour ceux qui s'intéressent à ce sujet, les nouvelles bibliothèques de Google utilisent proto plus, une enveloppe pour les messages proto de Python. L'utilisation de cette fonction d'aide a fonctionné pour moi (cred : tobked)

import json

import proto

def proto_message_to_dict(message: proto.Message) -> dict:
    """Helper method to parse protobuf message to dictionary."""
    return json.loads(message.__class__.to_json(message))

https://github.com/googleapis/python-memcache/issues/19

2voto

MonkeyFish Points 612

Après avoir essayé plusieurs solutions différentes (je travaille sur un Mac), celle qui a fonctionné pour moi est de réinstaller protobuf en utilisant :

PROTOC_ZIP=protoc-3.7.1-osx-x86_64.zip
curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v3.7.1/$PROTOC_ZIP
sudo unzip -o $PROTOC_ZIP -d /usr/local bin/protoc
sudo unzip -o $PROTOC_ZIP -d /usr/local 'include/*'
rm -f $PROTOC_ZIP

Comme il est souligné dans cet article

2voto

davzaman Points 682

Le problème pour moi était que j'avais libprotobuf à l'adresse 3.11 y protobuf à l'adresse 3.15 La mise à jour de libprotobuf a réglé le problème pour moi.

1 votes

Il n'y a pas de paquet appelé libprotobuf sur pypi ?

0 votes

Je pense que c'est sur anaconda, je ne l'ai pas explicitement installé, je pense qu'il a été installé comme une dépendance de quelque chose d'autre.

1 votes

Cela a marché pour moi. Plus précisément, en faisant conda install -c conda-forge libprotobuf=3.15 . J'ai dû spécifier la version et la mettre à jour.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X