Warum sehe ich Fehler „kann nicht Namen descriptor_pb2 importieren“, wenn Google Protocol Buffers mit?
-
11-09-2019 - |
Frage
Wenn das erzeugte Python-Code aus unseren protobuf Klassen, bekommen wir diesen Fehler:
cannot import name descriptor_pb2
Der äquivalente C ++ generierte Code funktioniert gut, so dass es scheint, dass es kein Problem mit unseren tatsächlichen Proto Definitionen ist.
Dieser Fehler tritt auf, wenn ich versuche, und unsere Klasse importieren, etwa so:
import sys
sys.path.append('..\path\to\generated')
sys.path.append('..\contrib\protobuf\python')
from foobar_pb2 import FooBar
Ist es richtig, die Systempfade anhängen?
checkte ich im protobuf\python\google\protobuf
Verzeichnis für descriptor_pb2.py
aber nur gefunden descriptor.py
-. Wir verwenden die neueste Version, so dass ich davon ausgehen, wir haben noch keine Dateien fehlen
Wer weiß, was die Lösung ist?
Lösung
Ich glaube, Sie descriptor_pb2.py
mit protoc
zu erzeugen, haben Sie sich:
protoc descriptor.proto --python_out=gen/
gen/
ist ein Ordner mit generierten Python-Klassen.
Danach werden die folgenden funktioniert gut:
sys.path.append('../gen')
from descriptor_pb2 import FileDescriptorSet
../gen/descriptor_pb2.py
muss vorhanden ist.
Andere Tipps
In meinem Fall nicht finden descriptor_pb2 aufgetreten, weil protobuf nicht korrekt installiert wurde. In der Python-Unterverzeichnis von protobuf, müssen Sie laufen
python setup.py build
python setup.py test
python setup.py install (as root)
Bitte stellen Sie sicher, dass die protobuf Laufzeitbibliothek installieren, wie in der Readme-Datei gerichtet. Sie können nicht einfach die Quelle direkt aus dem Paket verwenden, da descriptor_pb2.py von Protoc erzeugt werden muss (der protobuf Compiler) als Teil des Installationsprozesses.
Ich verwende Python 2.7 auf Windows 10.
In meinem Fall ich habe Protoc-3.0.0-beta-2-win32 von https: / /github.com/google/protobuf/releases und kopiert die binäre Protoc-Datei src Ordner.
danach habe ich den Befehl ausgeführt haben python setup.py build und die descriptor_pb2 generiert wurde.
python setup.py build
Dieser Schritt ist zwingend notwendig, da es einige der Quelldateien erzeugt werden.
Die Erzeugung google / protobuf / descriptor_pb2.py ... Generieren google / protobuf / Compiler / plugin_pb2.py ... Generieren google / protobuf / unittest_pb2.py ... Generieren google / protobuf / unittest_custom_options_pb2.py ... Generieren google / protobuf / unittest_import_pb2.py ... Generieren google / protobuf / unittest_import_public_pb2.py ... Generieren google / protobuf / unittest_mset_pb2.py ... Generieren google / protobuf / unittest_no_generic_services_pb2.py ... Generieren google / protobuf / intern / descriptor_pool_test1_pb2.py ... Generieren google / protobuf / intern / descriptor_pool_test2_pb2.py ... Generieren google / protobuf / intern / test_bad_identifiers_pb2.py ... Generieren google / protobuf / intern / missing_enum_values_pb2.py ... Generieren google / protobuf / intern / more_extensions_pb2.py ... Generieren google / protobuf / intern / more_extensions_dynamic_pb2.py ... Generieren google / protobuf / intern / more_messages_pb2.py ... Generieren google / protobuf / intern / factory_test1_pb2.py ... Generieren google / protobuf / intern / factory_test2_pb2.py ... Generieren google / protobuf / pyext / python_pb2.py ... bla ...
Gerade die 'descriptor_pb2.py'