Perché vedo “non può importare nome descriptor_pb2” l'errore quando si utilizza Google buffer protocollo?

StackOverflow https://stackoverflow.com/questions/1828379

  •  11-09-2019
  •  | 
  •  

Domanda

Quando si utilizza il codice Python generato dalle nostre classi protobuf, otteniamo questo errore:

cannot import name descriptor_pb2

L'equivalente C ++ generato il codice funziona bene, quindi sembrerebbe che non v'è alcun problema con le nostre definizioni attuali proto.

Questo errore si verifica quando cerco di importare la nostra classe, in questo modo:

import sys
sys.path.append('..\path\to\generated')
sys.path.append('..\contrib\protobuf\python')

from foobar_pb2 import FooBar

È corretto per aggiungere i percorsi di sistema?

Ho controllato nella directory protobuf\python\google\protobuf per descriptor_pb2.py ma scoperto solo descriptor.py -. Stiamo usando la versione più recente, in modo da assumere non abbiamo alcun file mancante

Qualcuno sa quale sia la soluzione?

È stato utile?

Soluzione

Credo che è necessario generare descriptor_pb2.py con protoc te stesso:

protoc descriptor.proto --python_out=gen/

gen/ è una cartella con le classi Python generate.

Dopo di che, i seguenti funziona bene:

sys.path.append('../gen')
from descriptor_pb2 import FileDescriptorSet

../gen/descriptor_pb2.py must esiste.

Altri suggerimenti

Nel mio caso, si è verificato non trovando descriptor_pb2 perché protobuf non è stato installato correttamente. Nella sottodirectory pitone di protobuf, assicurarsi di eseguire

python setup.py build
python setup.py test
python setup.py install (as root)

Si prega di assicurarsi di installare la libreria di runtime protobuf come indicato nel file readme. Non si può semplicemente utilizzare l'origine direttamente dalla confezione, in quanto descriptor_pb2.py ha bisogno di essere generato dalla ProtoC (il compilatore protobuf) come parte del processo di installazione.

Io uso python 2.7 su Windows 10.

Nel mio caso, ho scaricato ProtoC-3.0.0-beta-2-win32 da https: / /github.com/google/protobuf/releases e copiate il file ProtoC binario nella cartella src.

dopo che ho eseguito il comando python setup.py costruzione e la descriptor_pb2 è stata generata.

python setup.py costruzione

Questo passaggio è obbligatorio in quanto generato alcuni dei file di origine.

  

Generazione di google / protobuf / descriptor_pb2.py ... Generazione   google / protobuf / compilatore / plugin_pb2.py ... Generazione   google / protobuf / unittest_pb2.py ... Generazione   google / protobuf / unittest_custom_options_pb2.py ... Generazione   google / protobuf / unittest_import_pb2.py ... Generazione   google / protobuf / unittest_import_public_pb2.py ... Generazione   google / protobuf / unittest_mset_pb2.py ... Generazione   google / protobuf / unittest_no_generic_services_pb2.py ... Generazione   google / protobuf / interno / descriptor_pool_test1_pb2.py ... Generazione   google / protobuf / interno / descriptor_pool_test2_pb2.py ... Generazione   google / protobuf / interno / test_bad_identifiers_pb2.py ... Generazione   google / protobuf / interno / missing_enum_values_pb2.py ... Generazione   google / protobuf / interno / more_extensions_pb2.py ... Generazione   google / protobuf / interno / more_extensions_dynamic_pb2.py ... Generazione   google / protobuf / interno / more_messages_pb2.py ... Generazione   google / protobuf / interno / factory_test1_pb2.py ... Generazione   google / protobuf / interno / factory_test2_pb2.py ... Generazione   google / protobuf / pyext / python_pb2.py ... bla ...

Proprio la 'descriptor_pb2.py'

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top