使用swig绑定google协议缓冲区
我正在编写需要处理大量小而复杂的protobuf编码消息的python程序。 我试图使用协议缓冲区的Python实现,它是用纯Python编写的,但其性能非常糟糕。
所以我正在寻找一种解决方案,显然有些人开始工作 - 使用protoc生成C ++文件,然后使用swig将它们用python包装起来。 问题是我无法到达一个可用的Python模块。
当使用-includeall
运行swig时,为了确保生成的消息类使用的所有Google基类/实用程序类也被包装 - swig失败,抱怨缺少系统包含文件(例如“string”)。 我无法用-I标志或复制整个包含目录来解决此问题。 环境是Ubuntu 10.04,protobuf 2.2.0,swig 1.3.40,gcc 4.4.3。
如果没有这个标志,我可以为我的消息类生成一个python模块,但是这个模块没用:生成的Python消息类缺少Message基类提供的所有功能 - 特别是除了一个de-序列化方法。 剩下的一个方法(MergePartialFromCodedStream)将不会运行,因为它需要一个类型为CodedInputStream的输入流(它是protobuf基础结构的一部分,因此不包含swig)。
我想知道是否有人有一个工作的例子,让swig在protobuf-C ++之上工作?
另外 - 是否有其他解决方案的例子,例如同一页面中提到的Python扩展? 尽管这看起来像是我的动态模式的高维护解决方案......
如果这些都不起作用,我正在考虑将python放到Groovy的位置 - 假设协议缓冲区的Java实现会更有效率。 对此有何评论?
Muchas Gracias!
Protobuf的新版本支持在Python代码中使用Protobuf的快速C ++实现。 设置环境变量PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION = cpp。
这里是我最终使用的Greplin fast-python-pb解决方案的正确链接。 它非常易于使用(至少在Linux中),性能提高了100倍。
这个软件还很年轻,与Google的实现不完全兼容,至少在可选字段中为空值 - 但差异很小。
尝试在SWIG文件中明确包含生成的头文件,并明确指定基类文件(而不是使用includeall)。 你应该能够明确地知道SWIG理解你想绑定基类和派生类。
链接地址: http://www.djcxy.com/p/8467.html上一篇: using swig to bind google protocol buffers
下一篇: backbone.js collection not properly removing item in view