¿Por qué veo “no puede importar descriptor_pb2 nombre de” error al utilizar Google Protocol Buffers?
-
11-09-2019 - |
Pregunta
Cuando se utiliza el código Python generado a partir de nuestras clases protobuf, se obtiene este error:
cannot import name descriptor_pb2
El equivalente de C ++ genera código funciona muy bien, por lo que parece que no hay ningún problema con nuestras definiciones actuales proto.
Este error se produce cuando intento e importar nuestra clase, así:
import sys
sys.path.append('..\path\to\generated')
sys.path.append('..\contrib\protobuf\python')
from foobar_pb2 import FooBar
¿Es correcto que se añadirán las rutas del sistema?
he comprobado en el directorio protobuf\python\google\protobuf
para descriptor_pb2.py
pero sólo encontré descriptor.py
-. Estamos utilizando la versión más reciente, así que supongo que no tenemos archivos que faltan
¿Alguien sabe cuál es la solución?
Solución
Creo que tiene para generar descriptor_pb2.py
con protoc
mismo:
protoc descriptor.proto --python_out=gen/
gen/
es una carpeta con las clases de Python generados.
Después de eso, los siguientes funciona bien:
sys.path.append('../gen')
from descriptor_pb2 import FileDescriptorSet
../gen/descriptor_pb2.py
existe necesidad.
Otros consejos
En mi caso, se produjo al no encontrar descriptor_pb2 porque protobuf no se ha instalado correctamente. En el subdirectorio pitón de protobuf, asegúrese de ejecutar
python setup.py build
python setup.py test
python setup.py install (as root)
Por favor, asegúrese de instalar la biblioteca de ejecución protobuf como se indica en el archivo readme. Simplemente no se puede utilizar la fuente directamente fuera del paquete, ya que descriptor_pb2.py necesita ser generada por protoc (el compilador protobuf) como parte del proceso de instalación.
Yo uso Python 2.7 en Windows 10.
En mi caso, he descargado protoc-3.0.0-beta-2-Win32 desde https: / /github.com/google/protobuf/releases y copiar el archivo binario a protoc carpeta src.
después de que he ejecutar el comando python setup.py build se ha generado y la descriptor_pb2.
python setup.py build
Este paso es obligatorio, ya que genera algunos de los archivos de origen.
La generación de Google / protobuf / descriptor_pb2.py ... Generación Google / protobuf / compilador / plugin_pb2.py ... Generación Google / protobuf / unittest_pb2.py ... Generación Google / protobuf / unittest_custom_options_pb2.py ... Generación Google / protobuf / unittest_import_pb2.py ... Generación Google / protobuf / unittest_import_public_pb2.py ... Generación Google / protobuf / unittest_mset_pb2.py ... Generación Google / protobuf / unittest_no_generic_services_pb2.py ... Generación Google / protobuf / interno / descriptor_pool_test1_pb2.py ... Generación Google / protobuf / interno / descriptor_pool_test2_pb2.py ... Generación Google / protobuf / interno / test_bad_identifiers_pb2.py ... Generación Google / protobuf / interno / missing_enum_values_pb2.py ... Generación Google / protobuf / interno / more_extensions_pb2.py ... Generación Google / protobuf / interno / more_extensions_dynamic_pb2.py ... Generación Google / protobuf / interno / more_messages_pb2.py ... Generación Google / protobuf / interno / factory_test1_pb2.py ... Generación Google / protobuf / interno / factory_test2_pb2.py ... Generación Google / protobuf / pyext / python_pb2.py ... bla ...
Precisamente el 'descriptor_pb2.py'