Почему я вижу ошибку "не удается импортировать дескриптор имени pb2" при использовании буферов протокола Google?

при использовании сгенерированного кода Python из наших классов protobuf мы получаем следующую ошибку:

cannot import name descriptor_pb2

эквивалентный сгенерированный код C++ работает просто отлично, поэтому, похоже, что нет никаких проблем с нашими фактическими определениями proto.

эта ошибка возникает, когда я пытаюсь импортировать наш класс, например:

import sys
sys.path.append('..pathtogenerated')
sys.path.append('..contribprotobufpython')

from foobar_pb2 import FooBar

правильно ли добавлять системные пути?

Я проверил в

5 ответов


Я считаю, что вы должны создать descriptor_pb2.py С protoc сам себе:

protoc descriptor.proto --python_out=gen/

gen/ - Это папка с сгенерированными классами python.

после этого прекрасно работает:

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

../gen/descriptor_pb2.py должна существовать.


в моем случае не удалось найти descriptor_pb2, потому что protobuf был установлен неправильно. В подкаталоге python protobuf обязательно запустите

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

пожалуйста, не забудьте установить библиотеку времени выполнения protobuf, как указано в файле readme. Вы не можете просто использовать источник непосредственно из пакета, так как descriptor_pb2.py необходимо сгенерировать protoc (компилятор protobuf) в рамках процесса установки.


Я использую python 2.7 в windows 10.

в моем случае я загрузил protoc-3.0.0-beta-2-win32 из https://github.com/google/protobuf/releases и скопировал двоичный файл протокола в папку src.

после этого я запустил команду python setup.py build и был создан descriptor_pb2.


python setup.py build

этот шаг является обязательным, поскольку оно дает некоторые исходные файлы.

генерация google/protobuf/descriptor_pb2.py ... генерация google/protobuf/compiler/plugin_pb2.py ... генерация google/protobuf/unittest_pb2.py ... генерация google/protobuf/unittest_custom_options_pb2.py ... генерация google/protobuf/unittest_import_pb2.py ... генерация google/protobuf/unittest_import_public_pb2.py ... генерация google/protobuf/unittest_mset_pb2.py ... генерация google/protobuf/unittest_no_generic_services_pb2.py ... генерация google/protobuf/internal/descriptor_pool_test1_pb2.py ... генерация google/protobuf/internal/descriptor_pool_test2_pb2.py ... генерация google/protobuf/internal/test_bad_identifiers_pb2.py ... генерация google/protobuf/internal/missing_enum_values_pb2.py ... генерация google/protobuf/internal/more_extensions_pb2.py ... генерация google/protobuf/internal/more_extensions_dynamic_pb2.py ... генерация google/protobuf/internal/more_messages_pb2.py ... генерация google/protobuf/internal/factory_test1_pb2.py ... генерация google/protobuf/internal/factory_test2_pb2.py ... генерация google/protobuf/pyext/python_pb2.py... бла...

точно 'descriptor_pb2.py'