Использование Swig для привязки буферов протокола Google - PullRequest
7 голосов
/ 13 июля 2011

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

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

  • При запуске swig с -includeall, чтобы гарантировать, что все базовые / служебные классы Google используются сгенерированным сообщениемклассы также переносятся - swig терпит неудачу, жалуясь на отсутствующие системные включаемые файлы (например, «string»).Я не мог обойти это с флагами -I или копированием целых каталогов включения.Среда: 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 будет более эффективной.,Любой комментарий по этому поводу?

Muchas Gracias!

Ответы [ 3 ]

2 голосов
/ 17 июля 2011

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

1 голос
/ 13 июля 2011

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

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

0 голосов
/ 13 июля 2011

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

...