2011-07-12 54 views
7

我正在寫python程序,需要處理很多小而複雜的protobuf編碼消息。我試圖使用協議緩衝區的Python實現,它是用純Python編寫的,但其性能非常糟糕。使用swig綁定google協議緩衝區

所以我正在尋找一個解決方案,顯然some folks got to work - 使用protoc生成C++文件,然後使用swig用python包裝它們。問題是我無法到達一個可用的Python模塊。

  • 當運行痛飲與-includeall,以 確保所有生成的 消息類所使用的谷歌基礎/實用工具類也得到包裹 - 痛飲失敗,抱怨丟失的系統包括文件(例如「字符串」) 。我無法用-I標誌或複製整個包含目錄來解決此問題。環境是Ubuntu 10.04,protobuf 2.2.0,swig 1.3.40,gcc 4.4.3。

  • 沒有這個標誌,我能夠產生一個Python模塊爲我 郵件類,但該模塊是沒用的:生成的Python的 消息類缺少由消息 基類提供的所有函數 - 特別是除了其中之一以外的反序列化方法。剩下的 (MergePartialFromCodedStream)的一種方法將不會運行,因爲它需要輸入 CodedInputStream類型的流(它是protobuf基礎結構的 的一部分,因此沒有用swig包裝 )。

我想知道是否有人有一個工作的例子,讓swig在protobuf-C++之上工作?

或者 - 是否有其他解決方案的示例,如同一頁面中提到的Python擴展?雖然這似乎是我的動態模式的高維護解決方案...

如果這些工作都不起作用,我正在考慮將python放棄以支持Groovy - 假設協議緩衝區的Java實現會更有效。對此有何評論?

Muchas Gracias!

回答

0

嘗試將生成的標頭顯式包含在SWIG文件中,並且還包含基類文件(而不是使用includeall)。你應該能夠明確地知道SWIG理解你想綁定基類和派生類。

+0

謝謝約翰... 我終於通過使用Greplin工具(https://github.com/Greplin)得到了這個整理 - 強烈推薦! –

1

這裏是我最終使用的Greplin fast-python-pb解決方案的正確鏈接。 它很容易使用(至少在Linux中),性能提高了100倍。

這個軟件還很年輕,與Google的實現不是100%兼容,至少在可選字段中爲空值 - 但差異很小。