发布时间:2019-09-09 08:51:11编辑:auto阅读(4062)
跨语言通信方案的比较—Thrift、Protobuf和Avro
python+protobuf 在python中使用protocol buffer


解压后重命名文件夹如下【也可以保持原有的文件夹名不动】

下载解压后,将文件夹bin下面的exe执行程序拷贝到上一步的protobuff目录任意文件夹下

比如放在src目录下

配置系统环境变量 【Path】

启动CMD,输入protoc,验证配置是否成功

我们可以看到编译器的一些参数,其支持输出的语言类型包括C++,C#,Python,Java等

比如:

syntax = "proto3";
message Person {
int32 id = 1 ; //message体内的字段序号从1开始往下排
string name = 2 ;
} 上述定义了一个消息体,名称是Person,编译后等同于Python的模块、Java的类、C++的头和源文件,其中有两个字段,一个是32位的id,一个是字符串name
关于proto的字段类型有哪些,可以参考:Protocol Buffer 语法(syntax)
切换到最开始我们下载的protocol的目录下,找到python文件夹,进去,依次执行
python setup.py build
python setup.py test
python setup.py install执行前目录结构:

执行后:


有了proto文件,我们需要用protoc.exe工具将其编译成Python语言可以识别的Person模块【py】
编译命令: protoc -I=输入目录 --python_out=python模块的输出目录 空格 proto文件的绝对路径
打开CMD窗口,由于protoc.exe的环境变量已配置,所以比着上面的模子在窗口中写:
protoc -I=D:/proto --python_out=D:/proto D:/proto/person.proto

不报错就OK,随后,我们可以看到同目录下多了一个文件出来

别小看person.proto这个文件,这个文件可是跨语言的二进制协议文件,也就是我们只需要定义通信的message体,即可实现C++、Java、Python、JS、PHP等语言平台之间的通信,而且这种传输效率很高,后续我会针对Python和Java这两种语言实现基于这种传输协议的Web Restful接口的调用
话不多说,我们在当前目录下,新建一个demo模块,并引入模块person_pb2.py如下

随后我们可以从这个模块中拿出一个person的对象,并很嗨皮的给其附上对应的属性值,如下

我们看一下person_pb2.py这个模块中的属性字段怎么定义的

最后,我们执行下,打印一下person这个对象的信息如下

上一篇: python处理html中的转义字符
下一篇: python--读取环境变量
51287
50738
41336
38147
32616
29516
28366
23237
23203
21528
1602°
2336°
1936°
1876°
2204°
1921°
2604°
4374°
4224°
2996°