2009-12-01 1 views
4

При использовании сгенерированного кода Python из наших классов Protobuf, мы получаем эту ошибку:Почему я вижу ошибку «невозможно импортировать имя descriptor_pb2» при использовании буферов протокола Google?

cannot import name descriptor_pb2 

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

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

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

from foobar_pb2 import FooBar 

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

Я зарегистрировался в каталоге protobuf\python\google\protobuf для descriptor_pb2.py, но только нашел descriptor.py - мы используем последнюю версию, так что, полагаю, у нас нет файлов.

Кто-нибудь знает, что это за решение?

ответ

6

Я считаю, что вы должны генерировать descriptor_pb2.py с protoc себя:

protoc descriptor.proto --python_out=gen/ 

папка с сгенерированные классы питона.

После этого, следующие работы просто отлично:

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

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

+1

Несмотря на то, что после генерации файла descriptor_pb2.py, я получаю сообщение об ошибке, в котором говорится, что дескриптор_pb2 ссылается на него сам в своем ввозе любой идеи, как его решить –

2

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

5

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

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

Спасибо! оно работает!! – KayKay

+0

Вы также можете просто остановиться после шага 'python setup.py build' и указать на каталог build/lib. – teeks99

0

питона setup.py строить

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

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...

Точно 'descriptor_pb2.py'

1

Я использую Python 2.7 на окнах 10.

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

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