使用swig绑定google协议缓冲区

2024-10-01 13:35:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写python程序,它需要处理大量小而复杂的protobuf编码消息。我试图使用协议缓冲区的Python实现,它是用纯Python编写的,但是它的性能非常糟糕。在

所以我正在研究一个解决方案,显然是{a1}——使用PotoC生成C++文件,然后使用SWIG将它们用Python包起来。问题是我无法访问一个工作的Python模块。在

  • 使用-includeall运行swig时,到 确保生成的 消息类也会被包装-swig失败,抱怨缺少系统包含文件(例如“string”)。我不能用-I标志或复制整个include目录来解决这个问题。环境是ubuntu10.04,protobuf 2.2.0,swig1.3.40,gcc4.4.3。

  • 没有这个标志,我可以为 消息类,但是这个模块是无用的:生成的Python 消息类缺少消息提供的所有函数 基类-尤其是 反序列化方法。剩下的唯一方法 (MergePartialFromCodedStream)无法运行,因为它需要输入 CodedInputStream类型的流(即 是protobuf基础设施的一部分,因此没有被包装 用swig)。

我想知道是否有一个工作实例让Sigg在PotoBuffC++上运行?在

或者-是否有其他解决方案的例子,比如同一页中提到的Python扩展?虽然对于我的动态模式来说这似乎是一个高维护性的解决方案。。。在

如果这些都不起作用,我会考虑放弃python而支持Groovy——假设协议缓冲区的Java实现会更高效。对此有何评论?在

谢谢你!在


Tags: 模块文件方法程序消息协议编码标志
3条回答

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

与Google软件相比,这100%的可选值仍然是可以兼容的,但至少这100%与Google的实现值是相当小的差异。在

New version of Protobuf supports using the fast C++ implementation of Protobuf使用Python代码。设置环境变量PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=cpp。在

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

相关问题 更多 >