Why do I see “cannot import name descriptor_pb2” e

2019-02-22 01:36发布

问题:

When using the generated Python code from our protobuf classes, we get this error:

cannot import name descriptor_pb2

The equivalent C++ generated code works just fine, so it would appear that there is no problem with our actual proto definitions.

This error occurs when I try and import our class, like so:

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

from foobar_pb2 import FooBar

Is it correct to append the system paths?

I checked in the protobuf\python\google\protobuf directory for descriptor_pb2.py but only found descriptor.py - we're using the latest version, so I assume we don't have any files missing.

Does anyone know what the solution is?

回答1:

I believe you have to generate descriptor_pb2.py with protoc yourself:

protoc descriptor.proto --python_out=gen/

gen/ is a folder with generated python classes.

After that, the following works just fine:

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

../gen/descriptor_pb2.py must exists.



回答2:

In my case, not finding descriptor_pb2 occurred because protobuf wasn't correctly installed. In the python subdirectory of protobuf, be sure to run

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


回答3:

Please make sure to install the protobuf runtime library as directed in the readme file. You cannot simply use the source directly out of the package, since descriptor_pb2.py needs to be generated by protoc (the protobuf compiler) as part of the installation process.



回答4:

I use python 2.7 on windows 10.

In my case, I have downloaded protoc-3.0.0-beta-2-win32 from https://github.com/google/protobuf/releases and copied the binary protoc file to src folder.

after that I have run the command python setup.py build and the descriptor_pb2 was generated.



回答5:

python setup.py build

This step is mandatory as it generated some of the source files.

Generating google/protobuf/descriptor_pb2.py... Generating google/protobuf/compiler/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/internal/descriptor_pool_test1_pb2.py... Generating google/protobuf/internal/descriptor_pool_test2_pb2.py... Generating google/protobuf/internal/test_bad_identifiers_pb2.py... Generating google/protobuf/internal/missing_enum_values_pb2.py... Generating google/protobuf/internal/more_extensions_pb2.py... Generating google/protobuf/internal/more_extensions_dynamic_pb2.py... Generating google/protobuf/internal/more_messages_pb2.py... Generating google/protobuf/internal/factory_test1_pb2.py... Generating google/protobuf/internal/factory_test2_pb2.py... Generating google/protobuf/pyext/python_pb2.py... bla...

Precisely the 'descriptor_pb2.py'