2012-06-30 1 views
6

У меня есть проект PyDev, который использует буферы протокола. Файлы буфера протокола расположены в zip-файле, сгенерированном компилятором protoc. Все работает, когда я запускаю программу, однако PyDev сообщает «Неопределенная переменная из импорта» для каждой константы перечисления. Так, например:Неопределенная переменная от импорта при использовании буферов протокола в PyDev

import model_pb2 

value = model_pb2.Expression(type = model_pb2.Expression.PARAMETER) 

Он сообщает перечисление постоянной «ПАРАМЕТР» как неопределенная переменная. В моей программе есть несколько десятков подобных ошибок, и я бы исправил их «правильно» (т. Е. Не просто подавил предупреждение.)

ответ

0

Вы пытались добавить «model_pb2» к форсированным встроенным настройкам? См.: http://pydev.org/manual_101_project_conf2.html для деталей.

+0

Нет, это не поможет. – Talin

+0

Можно ли посмотреть на этот zip-файл с исходным кодом, чтобы узнать, что может произойти? –

1

Я обнаружил, что использование встроенных функций может работать, но только если все прото-файлы находятся в отдельной внешней библиотеке (см. http://pydev.org/manual_101_project_conf2.html).

Это должно работать:

  1. Move (или разархивировать) скомпилированные прото файлов, включая model_pb2.py в каталог вне проекта Pydev.
  2. Добавьте пустой файл __init__.py в тот же каталог, что и model_pb2.py, чтобы он мог быть импортирован как библиотека.
  3. В eclipse перейдите в Windows -> Настройки -> pydev -> Интерпретатор
  4. Добавьте каталог в model_pb2.py в Библиотеки.
  5. Добавить model_pb2 в принудительные buildins.

Если вы не зависите от автозаполнения, вы можете использовать ctrl + 1 для игнорирования этих ошибок вместо as described in this answer. Это было проверено с помощью Eclipse Kepler и pydev 2.8.

0

Я столкнулся с этой проблемой с protobuf 2.6.1 и PyDev 4.5.5. Я попробовал предложения выше, и никто из них не помог мне в этом деле. То, что в конечном итоге избавилось от ошибок «неопределенной переменной» при использовании protobuf enums, было простым:

Доступ к перечислению на экземпляр объекта protobuf, а не на модуль protobuf.

Я не уверен, если это может быть применено к прецеденту в ФП, но в моем это было так просто, как:

from myprotobuf_module import SomeProtobufMessage 

some_protobuf_object = SomeProtobufMessage() 
some_enum = some_protobuf_object.SOME_ENUM