在Python 3.4里使用Protobuf 2.6

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/caimouse/article/details/45339861
在开发领域里,协议的使用是经常的事情,只要通讯的地方,就要使用到。比如客户端与服务器通讯,比如嵌入式系统与上位机系统通讯,
比如不同进程之间进行数据通讯,这些地方都需要使用。但协议的定义的方式也有很多种,最常使用就是开发者自己定义的格式,也有使用
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  深圳

没有更多推荐了,返回首页