использование swig для привязки буферов протокола Google

Я пишу программу python, которая должна обрабатывать множество небольших, но сложных сообщений, закодированных в protobuf. Я попытался использовать Python-реализацию буферов протоколов, написанную на чистом питоне, но ее производительность действительно ужасна.

Поэтому я ищу решение, которое, по-видимому, некоторым людям приходилось работать – используйте protoc для создания файлов на C ++, а затем используйте swig для их переноса с помощью python. Проблема в том, что я не могу добраться до рабочего модуля Python.

  • При запуске swig с -includeall , чтобы все классы базы Google / -includeall , используемые порожденными классами сообщений, также были обернуты – swig терпит неудачу, жалуясь на отсутствие системных файлов (например, «строка»). Я не мог обойти это с флагами -I или копированием целых каталогов include. Окружающая среда – Ubuntu 10.04, protobuf 2.2.0, swig 1.3.40, gcc 4.4.3.

  • Без этого флага я могу создать модуль python для своих классов сообщений, но этот модуль бесполезен: в сгенерированных классах сообщений Python отсутствуют все функции, предоставляемые базовым классом Message – в частности, все, кроме одного, методы сериализации. Один метод слева (MergePartialFromCodedStream) не будет запущен, потому что для него требуется входной поток типа CodedInputStream (который является частью инфраструктуры protobuf и поэтому не был обернут swig).

Мне было интересно, есть ли у кого-нибудь рабочий пример того, как заставить swig работать поверх protobuf-C ++?

В качестве альтернативы – есть ли пример какого-либо другого решения, такого как расширение Python, упомянутое на той же странице? Хотя это похоже на решение с высоким уровнем обслуживания для моей динамической схемы …

Если это не работает, я рассматриваю возможность сброса python в пользу Groovy – если предположить, что реализация буферов протокола Java будет более эффективной. Есть ли комментарии по этому поводу?

Большое спасибо!

3 Solutions collect form web for “использование swig для привязки буферов протокола Google”

Новая версия Protobuf поддерживает использование быстрой реализации C ++ Protobuf с кодом Python. Установите переменную среды PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION = cpp.

Вот правильная ссылка на решение fast-python-pb Greplin, которое я использовал. Он очень прост в использовании (по крайней мере, в Linux), а производительность – х100 раз.

Это программное обеспечение все еще молод и не на 100% совместимо с реализацией Google, по крайней мере, в отношении пустых значений в необязательных полях – но различия довольно незначительные.

Попробуйте% включить ваши созданные заголовки в ваш SWIG-файл, а также файлы базового класса явно (вместо использования includeall). Вы должны быть достаточно ясными, чтобы SWIG понимал, что вы хотите привязать базовые классы и производные.

  • C в Python через SWIG: не может получить недействительные ** параметры для хранения их значения
  • Отладка смешанного кода Python / C ++ в Eclipse
  • Связи SVN для Python для Windows
  • Как обрабатывать unique_ptr с помощью SWIG
  • Передача строки в agege в файле agraph.py. Проблема с networkx и pygraphviz
  • Прототипирование с кодом Python перед компиляцией
  • Поддерживает ли CMake Python3?
  • Обтекание класса C ++ в Python с использованием SWIG
  • Python - лучший язык программирования в мире.