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

Я пишу программу на Python, которая должна обрабатывать множество небольших, но сложных сообщений, закодированных в protobuf. Я попытался использовать реализацию буферов протоколов 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 в классах сообщений отсутствуют все функции, предоставляемые сообщением базовый класс - в частности, все, кроме одного из методы десериализации. Остался один метод (MergePartialFromCodedStream) не будет работать, потому что для этого требуется ввод поток типа CodedInputStream (который является часть инфраструктуры protobuf и поэтому не была обернута with swig).

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

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

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

Muchas Gracias!

7
задан django dude 12 July 2011 в 20:34
поделиться