Reputation: 39550
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?
Upvotes: 7
Views: 22461
Reputation: 11
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.
Upvotes: 1
Reputation: 11
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'
Upvotes: 0
Reputation: 601
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.
Upvotes: 9
Reputation: 71
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.
Upvotes: 3
Reputation: 526
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)
Upvotes: 5