Я пишу программу на 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!