Python 使用swig绑定google协议缓冲区
我正在编写python程序,该程序需要处理大量小而复杂的protobuf编码消息。我尝试使用协议缓冲区的Python实现,它是用纯Python编写的,但是它的性能非常糟糕Python 使用swig绑定google协议缓冲区,python,performance,optimization,swig,protocol-buffers,Python,Performance,Optimization,Swig,Protocol Buffers,我正在编写python程序,该程序需要处理大量小而复杂的protobuf编码消息。我尝试使用协议缓冲区的Python实现,它是用纯Python编写的,但是它的性能非常糟糕 所以我正在研究一个解决方案,显然使用PotoC生成C++文件,然后使用SWIG用Python来包装它们。问题是我无法访问一个正常工作的Python模块 使用-includeal运行swig时,要 确保生成的 消息类也会被包装-swig失败,抱怨缺少系统包含文件(例如“字符串”)。我无法使用-I标志或复制整个include目录
所以我正在研究一个解决方案,显然使用PotoC生成C++文件,然后使用SWIG用Python来包装它们。问题是我无法访问一个正常工作的Python模块
- 使用
运行swig时,要 确保生成的 消息类也会被包装-swig失败,抱怨缺少系统包含文件(例如“字符串”)。我无法使用-I标志或复制整个include目录来解决这个问题。环境是Ubuntu 10.04、protobuf 2.2.0、swig 1.3.40、gcc 4.4.3-includeal
- 没有这个标志,我就能够为我的 消息类,但这个模块是无用的:生成的Python 消息类缺少消息提供的所有函数 基类-尤其是除一个以外的所有 反序列化方法。剩下的一种方法 (MergePartialFromCodedStream)无法运行,因为它需要输入 CodedInputStream类型的流(即 protobuf基础设施的一部分,因此未包装 用swig)
谢谢你 尝试在SWIG文件和基类文件中显式地包含生成的头文件(而不是使用includeal)。您应该能够足够明确,使SWIG理解您想要绑定基类和派生类。这里是我最终使用的解决方案的正确链接。 它非常易于使用(至少在Linux中是如此),而且性能提高了x100倍
这个软件还很年轻,与Google的实现还不是100%兼容,至少在可选字段中的空值方面是如此,但与Python代码的差异非常小。设置环境变量PROTOCOL\u BUFFERS\u PYTHON\u IMPLEMENTATION=cpp。谢谢John。。。我最终通过使用Greplin工具()解决了这个问题-强烈推荐!