美文网首页
Protocol Buffer学习笔记(Python)

Protocol Buffer学习笔记(Python)

作者: 飘逸峰 | 来源:发表于2018-03-27 14:13 被阅读0次

    摘要

    项目中引入proto的依赖

    【两种方法】:
    方法1、 官网下载对应的语言包,这里下载protobuf-python-3.5.1.tar.gz,解压后进入python-protobuf-3.5.1/python目录,执行python3 setup.py install
    方法2 、【推荐】命令行执行pip3 install protobuf,此时会下载最新的protobuf版本,如果下载的版本与本地安装的proto命令版本不一致,有可能导致异常,所以此时最好指定要下载的版本号:pip3 install protobuf==3.5.1

    【注意】

    • 上面的安装方式是全局安装,安装成功后对应的依赖包都会被安装到对应的site-packages目录下,比如/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages使用IDE开发时,如PyCharm,绑定interpreter时要注意勾选inherit global site-packages,这样项目才能使用全局依赖中的所有包
    • 如果只是为当前项目安装依赖包可以不勾选inherit global site-packages,然后进入当前项目依赖的pip目录,即Location指定的路径下,执行./bin/pip install protobuf==3.5.1来安装需要的依赖包

    准备proto文件

    • proto示例文件参考[Protocol Buffer学习笔记(Java&NodeJS)]
      (https://www.jianshu.com/p/55f4b4b22dd2)
    • python同时支持proto2和proto3,所以如果基于proto3,这里注意去掉其中的requiredoptional,因为这里要求语法严格遵循proto3,不能在属性前出现requiredoptional,同时文件顶端要明确syntax = "proto3";

    生成proto对应的python文件

    • 命令行执行
      protoc --python_out=. OTIpcDef.proto
    • 此时会在当前目录下生成OTIpcDef_pb2.py,将该文件拷贝到项目中,比如放到项目根目录的proto目录下

    python中使用protobuf

    from proto import OTIpcDef_pb2
    
    otIpcList = OTIpcDef_pb2.OTIpcList()
    
    # list类型数据创建方式
    otIpc = otIpcList.otpic.add()
    otIpc.CompanyId = "companyId"
    otIpc.Source = "Source"
    otIpc.IPCType = OTIpcDef_pb2.baseInfoCompany
    # list类型数据创建方式
    baseInfoCompany = otIpc.baseInfoCompany.add()
    
    
    # print(type(baseInfoCompany))
    
    baseInfoCompany.Address = 110011
    baseInfoCompany.CompanyId = "companyId"
    baseInfoCompany.CompanyName = "companyName中文"
    baseInfoCompany.Identifier = "identifier"
    baseInfoCompany.BusinessScope = "BusinessScope"
    baseInfoCompany.ContactAddress = "ContactAddress"
    baseInfoCompany.EconomicType = "EconomicType"
    baseInfoCompany.RegCapital = "RegCapital"
    baseInfoCompany.LegalName = "LegalName"
    baseInfoCompany.LegalID = "LegalID"
    baseInfoCompany.LegalPhone = "LegalPhone"
    baseInfoCompany.State = 0
    baseInfoCompany.Flag = 1
    baseInfoCompany.UpdateTime = 20180226121212
    
    otIpc2 = otIpcList.otpic.add()
    otIpc2.CompanyId = "companyId"
    otIpc2.Source = "Source"
    otIpc2.IPCType = OTIpcDef_pb2.baseInfoCompanyStat
    baseInfoCompanyStat = otIpc2.baseInfoCompanyStat.add()
    baseInfoCompanyStat.CompanyId = "companyId"
    baseInfoCompanyStat.DriverNum = 10
    baseInfoCompanyStat.Flag = 0
    baseInfoCompanyStat.UpdateTime = 20180226121212
    baseInfoCompanyStat.VehicleNum = 5
    
    print("============================================")
    
    # print(otIpc)
    print(otIpcList)
    print("============================================")
    # 序列化
    b = otIpcList.SerializeToString()
    # 打印二进制数据
    print(b)
    
    print("============================================")
    
    otIpcList2 = OTIpcDef_pb2.OTIpcList()
    # 反序列化
    otIpcList2.ParseFromString(b)
    
    print(otIpcList2)
    
    

    相关文章

      网友评论

          本文标题:Protocol Buffer学习笔记(Python)

          本文链接:https://www.haomeiwen.com/subject/diajcftx.html