Почему я вижу ошибку "не удается импортировать дескриптор имени 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'