標籤:milang python
在開發領域裡,協議的使用是經常的事情,只要通訊的地方,就要使用到。比如用戶端與伺服器通訊,比如嵌入式系統與上位機系統通訊,
比如不同進程之間進行資料通訊,這些地方都需要使用。但協議的定義的方式也有很多種,最常使用就是開發人員自己定義的格式,也有使用
XML等格式,不過這兩種方式都存在不足之處的。首先來看自己定義的格式,如果採用二進位的方式,要調試協議格式,要處理不同的位置,
要處理動態增加的欄位等等,另外還要考慮到相容舊的協議的問題,這樣會隨著著維護時間越長,就要使用越來越多時間。其次,使用XML的
方式理解和調試都很方便,但會帶來通訊量比較大的問題,速度比較低一些。特別在中國目前電腦的配置水平還是比較低下的工廠,或者在嵌入
式系統為了降低成本而使用的低效能CPU,這樣對使用者體驗就會比較差。通過這個對比,使用protobuf是使用比較明智的,因為它是使用二進位
編碼,這樣通訊的資料包相對來說比較小,而相容性、動態性也不用考慮,這個庫本身已經定義好,另外它還支援多種開發語言使用同一
個協議的情況。不過,這個庫在這之前,主要支援Python 2.7版本,不支援Python 3.0以後的版本,如果想在Python 3.4裡使用,就需要針對
它的python代碼進行修改才可以使用。
1. 從官網下載源碼包解壓進入vsproject,使用visual studio 開啟解決方案,選擇protoc產生解決方案會在Release目錄下產生protoc.exe。
2. 進入python目錄 執行python setup.py build 然後執行python setup.py install。
3. 把它解壓在目錄C:\Python34\Lib\site-packages裡。
4. 編寫proto檔案,內容如下:
message testinfo { required int32 devtype = 1; required int32 devid = 2; required int32 unitid = 3; required int32 chlid = 4; optional int32 testid = 5 [default = 0]; required bytes stepdata = 6; }
把它命名為:test2.proto。
5. 把test2.proto轉換為py檔案:
protoc.exe --python_out=.\ test2.proto
這樣就會組建檔案test2_pb2.py。
6. 建立test2.py檔案來測試協議檔案 test2_pb2.py。
內容如下:
import test2_pb2import systestinfo = test2_pb2.testinfo()testinfo.devtype = 100testinfo.devid = 2testinfo.unitid = 3testinfo.chlid = 4testinfo.testid = 200testinfo.stepdata = b‘abc‘print(testinfo, testinfo.devtype)out = testinfo.SerializeToString()print(out)decode = test2_pb2.testinfo()decode.ParseFromString(out)print(decode)
運行結果如下顯示:
>>>
devtype: 100
devid: 2
unitid: 3
chlid: 4
testid: 200
stepdata: "abc"
100
b‘\x08d\x10\x02\x18\x03 \x04(\xc8\x012\x03abc‘
devtype: 100
devid: 2
unitid: 3
chlid: 4
testid: 200
stepdata: "abc"
>>>
7. 在整個測試中,會發現很多protobuf裡的py代碼並不能運行,因此需要一個一個錯誤進行修改,主要有如下幾方面:
1)long改為int
2) unicode改為str
3) basestring改為str
4) from cStringIO import StringIO改為from io import StringIO
5) xrange改為range
6) iteritems改為items
7) except UnicodeDecodeError, e:改為except UnicodeDecodeError as e:
主要就是參考從py2轉換為py3的資料,就基本上可以修改完成。
蔡軍生 QQ:9073204 深圳
在Python 3.4裡使用Protobuf 2.6