Pourquoi est-ce que je vois « ne peut pas importer le nom descriptor_pb2 » erreur lorsque vous utilisez Google Protocol Buffers?
-
11-09-2019 - |
Question
Lorsque vous utilisez le code Python généré par nos cours de protobuf, nous obtenons cette erreur:
cannot import name descriptor_pb2
L'équivalent code généré C ++ fonctionne très bien, il semble qu'il n'y a pas de problème avec nos définitions proto réels.
Cette erreur se produit lorsque je tente et importer notre classe, comme suit:
import sys
sys.path.append('..\path\to\generated')
sys.path.append('..\contrib\protobuf\python')
from foobar_pb2 import FooBar
Est-il exact ajouter les chemins du système?
J'ai vérifié dans le répertoire protobuf\python\google\protobuf
pour descriptor_pb2.py
mais seulement trouvé descriptor.py
-. Nous utilisons la dernière version, donc je suppose que nous n'avons pas les fichiers manquants
Quelqu'un sait-il ce que la solution est?
La solution
Je crois que vous devez générer descriptor_pb2.py
avec protoc
vous:
protoc descriptor.proto --python_out=gen/
gen/
est un dossier avec des classes de python générés.
Après cela, les travaux suivants très bien:
sys.path.append('../gen')
from descriptor_pb2 import FileDescriptorSet
doit de ../gen/descriptor_pb2.py
existe.
Autres conseils
Dans mon cas, ne pas trouver descriptor_pb2 eu lieu parce que protobuf n'a pas été correctement installé. Dans le sous-répertoire python de protobuf, assurez-vous d'exécuter
python setup.py build
python setup.py test
python setup.py install (as root)
faire S'il vous plaît Veillez à installer la bibliothèque d'exécution protobuf comme indiqué dans le fichier Lisez-moi. Vous ne pouvez pas utiliser simplement la source directement du paquet, car descriptor_pb2.py doit être générée par protoc (le compilateur protobuf) dans le cadre du processus d'installation.
J'utilise Python 2.7 sur Windows 10.
Dans mon cas, je l'ai téléchargé protoc-3.0.0-beta-2-win32 de https: / /github.com/google/protobuf/releases et copier le fichier binaire protoc dans le dossier src.
après que j'exécutez la commande python build setup.py et le descriptor_pb2 a été généré.
python setup.py build
Cette étape est obligatoire car il a généré certains des fichiers source.
Génération google / protobuf / descriptor_pb2.py ... Génération google / protobuf / compilateur / plugin_pb2.py ... Génération google / protobuf / unittest_pb2.py ... Génération google / protobuf / unittest_custom_options_pb2.py ... Génération google / protobuf / unittest_import_pb2.py ... Génération google / protobuf / unittest_import_public_pb2.py ... Génération google / protobuf / unittest_mset_pb2.py ... Génération google / protobuf / unittest_no_generic_services_pb2.py ... Génération google / protobuf / interne / descriptor_pool_test1_pb2.py ... Génération google / protobuf / interne / descriptor_pool_test2_pb2.py ... Génération google / protobuf / interne / test_bad_identifiers_pb2.py ... Génération google / protobuf / interne / missing_enum_values_pb2.py ... Génération google / protobuf / interne / more_extensions_pb2.py ... Génération google / protobuf / interne / more_extensions_dynamic_pb2.py ... Génération google / protobuf / interne / more_messages_pb2.py ... Génération google / protobuf / interne / factory_test1_pb2.py ... Génération google / protobuf / interne / factory_test2_pb2.py ... Génération google / protobuf / pyext / python_pb2.py ... Bla ...
Précisément le 'descriptor_pb2.py'