Por que vejo “não pode nome descriptor_pb2 importação” erro ao usar Google Protocol Buffers?

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

  •  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?

Foi útil?

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'

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top