IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]在Python 3.4里使用Protobuf 2.6

    caimouse发表于 2015-04-28 17:59:07
    love 0
    在开发领域里,协议的使用是经常的事情,只要通讯的地方,就要使用到。比如客户端与服务器通讯,比如嵌入式系统与上位机系统通讯,
    比如不同进程之间进行数据通讯,这些地方都需要使用。但协议的定义的方式也有很多种,最常使用就是开发者自己定义的格式,也有使用
    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_pb2
    import sys
    
    testinfo = test2_pb2.testinfo()
    testinfo.devtype = 100
    testinfo.devid = 2
    testinfo.unitid = 3
    testinfo.chlid = 4
    testinfo.testid = 200
    testinfo.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 深圳



沪ICP备19023445号-2号
友情链接