使用Swig来绑定Google Protocol Buffers

7
我正在编写一个Python程序,需要处理许多小但复杂的protobuf编码消息。我尝试使用纯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基类提供的所有函数 - 特别是除一个之外的所有反序列化方法。剩下的一个方法(MergePartialFromCodedStream)不会运行,因为它需要类型为CodedInputStream的输入流(它是protobuf基础设施的一部分,因此没有被swig包装)。

我想知道是否有人有一个工作示例,可以在protobuf-C++之上使用swig?

或者 - 是否有其他解决方案的示例,例如在同一页中提到的Python扩展?虽然这似乎是一种高维护解决方案,适用于我的动态架构...

如果这些都不起作用,我考虑放弃Python,转而使用Groovy——假设Java实现的协议缓冲区会更有效率。对此有何评论吗?
非常感谢!
3个回答

2

1

这是我最终使用的Greplin fast-python-pb解决方案的正确链接。 它非常易于使用(至少在Linux下),性能提升了100倍。

这个软件仍然很年轻,与Google实现相比,在可选字段中的空值方面还不是100%兼容-但差异相当小。


0
尝试在SWIG文件中显式包含生成的头文件和基类文件(而不是使用includeall)。您应该足够明确,以便SWIG理解您希望绑定基类和派生类。

谢谢John... 我最终通过使用Greplin工具(https://github.com/Greplin)解决了这个问题 - 强烈推荐! - django dude

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接