mac环境使用python处理protobuf
安装
brew install protobuf
然后再安装protobuf需要的依赖
brew install autoconf automake libtool
验证是否安装成功
protoc –version
protobuf3语法介绍
1.字段前取消了required和optional两个关键字,目前可用的只有repeated关键字。
2.不可以现设置默认值了。
a.string默认为空串
b.枚举默认为第一个枚举定义的第一个值。并且必须是0,必须有有一个0值,我们可以用这个0值作为默认值。
这个零值必须为第一个元素,为了兼容proto2语义,枚举类的第一个值总是默认值。
c.bytes默认为空bytes
d.bool默认为false
e.数字类型默认为0
3.protoType类型如下:
double、float、int32、int64、uint32、uint64、sint32、sint64、fixed32、fixed64、sfixed32、sfixed64、bool、string、bytes
4、分配标识号
正如你所见,在消息定义中,每个字段都有唯一的一个数字标识符。这些标识符是用来在消息的二进制格式中识别各个字段的,一旦开始使用就不能够再改变。注:[1,15]之内的标识号在编码的时候会占用一个字节。[16,2047]之内的标识号则占用2个字节。所以应该为那些频繁出现的消息元素保留 [1,15]之内的标识号。切记:要为将来有可能添加的、频繁出现的标识号预留一些标识号。
最小的标识号可以从1开始,最大到2^29 - 1, or 536,870,911。不可以使用其中的[19000-19999]( (从FieldDescriptor::kFirstReservedNumber 到 FieldDescriptor::kLastReservedNumber))的标识号, Protobuf协议实现中对这些进行了预留。如果非要在.proto文件中使用这些预留标识号,编译时就会报警。同样你也不能使用早期保留的标识号。
指定字段规则
所指定的消息字段修饰符必须是如下之一:
singular:一个格式良好的消息应该有0个或者1个这种字段(但是不能超过1个)。
repeated:在一个格式良好的消息中,这种字段可以重复任意多次(包括0次)。重复的值的顺序会被保留。
在proto3中,repeated的标量域默认情况虾使用packed。
编写protoco文件,addressbook.proto。
syntax = "proto3"; //正在使用proto3语法,如果你没有指定这个,编译器会使用proto2
package tutorial;
//*.proto文件中数据类型可以分为两大类:
//复合数据类型包括:枚举和message类型
//标准数据类型包含:整型,浮点,字符串等
message AddressBook {
//repeated: 该字段可以重复任意次数,包括0次。重复数据的顺序将会保存在protocol buffer中,将这个字段想象成一个可以自动设置size的数组就可以了。
repeated Person people = 1;
}
message Person {
//每个字段有一种类型
//该Number是用来标记该字段在序列化后的二进制数据中所在的field,
//每个字段的Number在message内部都是独一无二的。也不能进行改变,否则数据就不能正确的解包
string name = 1;
int32 id = 2;
string email = 3;
float money =4;
bool work_status = 5;
repeated PhoneNumber phones =6;
MyMessage maps =7;
}
message PhoneNumber{
string number =1;
PhoneType type =2;
}
enum PhoneType{
MOBILE =0;
HOME =1;
WORK =2;
}
message MyMessage{
map<int32,int32> mapfield =1;
}
编译生成python代码
protoc ./addressbook.proto --python_out=./
创建一个解析文件
protobufdemo.py
# -*- coding: utf-8 -*-
# @Time : 2019-11-15 11:25
# @Author : cxa
# @File : protobufdemo.py
# @Software: PyCharm
import addressbook_pb2
address_book = addressbook_pb2.AddressBook()
person = address_book.people.add()
person.id = 1
person.name = "cxa"
person.email = "1@qq.com"
person.money = 1234.00
person.work_status = True
phone_number = person.phones.add()
phone_number.number = "123456"
phone_number.type = addressbook_pb2.MOBILE
maps = person.maps
maps.mapfield[1] = 1
maps.mapfield[2] = 2
# 序列化
serializeTostring = address_book.SerializeToString() # 生成字节数组
str_result = address_book.ParseFromString(serializeTostring) # 转为字符串
print(str_result)
for person in address_book.people:
print(person)
for phone_number in person.phones:
print(phone_number)
for key in person.maps.mapfield:
print(key, person.maps.mapfield[key])
原文链接:https://blog.csdn.net/u013210620/article/details/81317731
mac环境使用python处理protobuf的更多相关文章
- mac环境下Python虚拟环境的安装和配置
虚拟环境(virtualenv) 安装:在终端输入 pip install virtualenv 如果没安装pip会出现 pip: command not found,此时需要进行 sudo easy ...
- 在MAC上搭建python数据分析开发环境
最近工作转型到数据开发领域,想在本地搭建一个数据开发环境.自己有三年python开发经验,马上想到使用numpy.scipy.sklearn.pandas搭建一套数据开发环境. ubuntu的环境,百 ...
- 【转】【Python + selenium】linux和mac环境,驱动器chromedriver和测试报告HTMLTestRunner放置的位置
感谢: 作者:gz_tester,文章:<linux和mac环境,chromedriver和HTMLTestRunner放置的位置> 使用场景 配置python selenium 环境 使 ...
- MAC平台基于Python的Appium环境搭建
前言 最近笔者要为python+appium课程做准备,mac在2019年重新安装了一次系统,这次重新在mac下搭建appium环境,刚好顺带写个文稿给大家分享分享搭建过程. 一.环境和所需软件概述 ...
- linux & mac环境python多版本切换与选择
linux和mac很多地方是相似的,只不过在切换python版本时权限有差异. ====图已补上,O(∩_∩)O~ 1.linux 首先linux内核自带版本是python2.6,但是一般linux ...
- python 处理protobuf协议
背景:需要用django基于python3模拟一个http接口,请求是post方式,body是protobuf string,返回也是protobuf string 设计:django获取pb str ...
- 【转】linux和windows下安装python集成开发环境及其python包
本系列分为两篇: 1.[转]windows和linux中搭建python集成开发环境IDE 2.[转]linux和windows下安装python集成开发环境及其python包 3.windows和l ...
- (mac环境)Appium安装了client包,但是提示no module named appium
背景 mac环境,使用pip install Appium-Python-Client已经安装了client包 问题 import appium,提示no module named appium ...
- Mac环境下 Python3安装及配置
1.mac 环境下安装 python3 .查看 mac 自带系统版本 #查看系统自带的python open /System/Library/Frameworks/Python.framework/V ...
随机推荐
- css盒模型。边框和内外边距
css盒模型: 外边距 边框 内填充 内容 盒模型分为两种: 标准盒模型: 怪异盒模型(IE盒模型): 边框:border border: 10px solid blue;表示设置10像素蓝色实线条的 ...
- 安装配置KVM虚拟化
安装KVM虚拟化 KVM需要硬件⽀持, 所以需要开启虚拟化⽀持 硬件设备直接在BIOS设置开启CPU虚拟化 个⼈电脑同样进⼊BIOS开启虚拟化⽀持 VM需要找到对应虚拟机开启对应的VT-EPT虚拟化技 ...
- win10安装Pytorch【最新版】
由于2019年4月16日和25日清华和中科大分别宣布停止Anaconda镜像服务,因此从2019年5月开始安装Pytorch都会出现一下错误: CondaHTTPError: HTTP 404 NOT ...
- linux系统编程之文件与io(五)
上一节中已经学习了文件描述符的复制,复制方法有三种,其中最后一种fcntl还并未使用到,关于这个函数,不光只有复制文件描述符的功能,还有其它一些用法,本节就对其进行一一剖析: fcntl常用操作: 这 ...
- oracle删除重复数据,只保留一条
比如,某个表要按照id和name重复,就算重复数据 delete from 表名 where rowid not in (select min(rowid) from 表名 group by id,n ...
- 织梦DedeCMS会员空间内的文章列表无法分页的解决方法
DedeCMS 5.7会员空间的文章列表分页显示不正常,总是显示0页0条记录错误.下面告诉大家如何解决这个问题: 找到并打开include/arc.memberlistview.class.php文件 ...
- Vue基础入门笔记
不是面向DOM进行编程,而是面向数据去编程.当数据发生改变,页面就会随着改变. 属性绑定(v-bind)和双向数据绑定(v-model) 模板指令(v-bind:)后面跟的内容不再是字符串而是: js ...
- arp和rarp协议
ARP与RARP详细解析 原创zlnnjit 发布于2016-04-03 15:12:15 阅读数 9544 收藏 展开 地址解析协议 ARP和逆地址解析协议RARP 1.基本关系: 2.地址解析 ...
- MySQL Create table as / Create table like
a.create table like方式会完整地克隆表结构,但不会插入数据,需要单独使用insert into或load data方式加载数据 b.create table as 方式会部分克隆表 ...
- Oracle substr() 字符截取函数
1.substr函数格式 (俗称:字符截取函数) 格式1: substr(string string, int a, int b); 格式2:substr(string string, int a ...