在Python 3.4里使用Protobuf 2.6

在开发领域里,协议的使用是经常的事情,只要通讯的地方,,就要使用到。比如客户端与服务器通讯,比如嵌入式系统与上位机系统通讯,比如不同进程之间进行数据通讯,这些地方都需要使用。但协议的定义的方式也有很多种,最常使用就是开发者自己定义的格式,也有使用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: 100devid: 2unitid: 3chlid: 4testid: 200stepdata: "abc"100b’\x08d\x10\x02\x18\x03 \x04(\xc8\x012\x03abc’devtype: 100devid: 2unitid: 3chlid: 4testid: 200stepdata: "abc">>>

7. 在整个测试中,会发现很多protobuf里的py代码并不能运行,因此需要一个一个错误进行修改,主要有如下几方面:1)long改为int2) unicode改为str3) basestring改为str4) from cStringIO import StringIO改为from io import StringIO5) xrange改为range6) iteritems改为items7) except UnicodeDecodeError, e:改为except UnicodeDecodeError as e:主要就是参考从py2转换为py3的资料,就基本上可以修改完成。

蔡军生 QQ:9073204 深圳

有一种旅行,叫单车旅行。它没有奢侈准备,

在Python 3.4里使用Protobuf 2.6

相关文章:

你感兴趣的文章:

标签云: