Por que vejo “não pode nome descriptor_pb2 importação” erro ao usar Google Protocol Buffers?
-
11-09-2019 - |
Pergunta
Ao usar o código Python gerada a partir de nossas aulas protobuf, ficamos com este erro:
cannot import name descriptor_pb2
A C ++ equivalente código gerado funciona muito bem, por isso parece que não há nenhum problema com as nossas definições proto reais.
Este erro ocorre quando tento importar nossa classe, assim:
import sys
sys.path.append('..\path\to\generated')
sys.path.append('..\contrib\protobuf\python')
from foobar_pb2 import FooBar
É correto para anexar os caminhos do sistema?
Eu verifiquei no diretório protobuf\python\google\protobuf
para descriptor_pb2.py
mas só encontrou descriptor.py
-. Nós estamos usando a versão mais recente, assim que eu supor que não temos quaisquer arquivos faltando
Alguém sabe qual é a solução?
Solução
Eu acredito que você tem que gerar descriptor_pb2.py
com protoc
-se:
protoc descriptor.proto --python_out=gen/
gen/
é uma pasta com classes Python geradas.
Depois disso, o seguinte funciona muito bem:
sys.path.append('../gen')
from descriptor_pb2 import FileDescriptorSet
existe ../gen/descriptor_pb2.py
obrigação.
Outras dicas
No meu caso, não encontrando descriptor_pb2 ocorreu porque protobuf não foi instalado corretamente. No subdiretório python de protobuf, certifique-se de executar
python setup.py build
python setup.py test
python setup.py install (as root)
Por favor, certifique-se de instalar a biblioteca de tempo de execução protobuf como indicado no arquivo readme. Você não pode simplesmente usar a fonte diretamente fora do pacote, uma vez que as necessidades descriptor_pb2.py a serem gerados pela PROTOC (o compilador protobuf) como parte do processo de instalação.
Eu uso Python 2.7 no Windows 10.
No meu caso, eu tenha baixado PROTOC-3.0.0-beta-2-win32 de https: / /github.com/google/protobuf/releases e copiou o arquivo PROTOC binário para pasta src.
depois que eu executar o comando eo descriptor_pb2 foi gerado python setup.py construção.
python setup.py build
Esta etapa é obrigatória, uma vez que gerou alguns dos arquivos de origem.
Generating google / protobuf / descriptor_pb2.py ... Generating google / protobuf / compilador / plugin_pb2.py ... Generating google / protobuf / unittest_pb2.py ... Generating google / protobuf / unittest_custom_options_pb2.py ... Generating google / protobuf / unittest_import_pb2.py ... Generating google / protobuf / unittest_import_public_pb2.py ... Generating google / protobuf / unittest_mset_pb2.py ... Generating google / protobuf / unittest_no_generic_services_pb2.py ... Generating google / protobuf / / interna descriptor_pool_test1_pb2.py ... Generating google / protobuf / / interna descriptor_pool_test2_pb2.py ... Generating google / protobuf / / interna test_bad_identifiers_pb2.py ... Generating google / protobuf / / interna missing_enum_values_pb2.py ... Generating google / protobuf / / interna more_extensions_pb2.py ... Generating google / protobuf / / interna more_extensions_dynamic_pb2.py ... Generating google / protobuf / / interna more_messages_pb2.py ... Generating google / protobuf / / interna factory_test1_pb2.py ... Generating google / protobuf / / interna factory_test2_pb2.py ... Generating google / protobuf / pyext / python_pb2.py ... bla ...
Precisamente o 'descriptor_pb2.py'