python调用动态链接库传送protobuf数据。
2010-12-05 15:24
357 查看
什么是protobuf
protobuf是Google提供的一个开源序列化框架,类似于XML,JSON这样的数据表示语言,其最大的特点是基于二进制,因此比传统的XML表示高效短小得多。开发者定义类似于结构体的message,通过protobuf的工具将定义好的格式传送给protobuf的接收工具,接收工具会自动产生类,需要传输的时候直接导入这个类,将关键字段填充,通过序列化函数,将其序列化,接收端将其反序列化,实现数据传输。protobuf支持c++,java,python。详细信息见参考文档。
protobuf的格式定义,可以看文档,这里举两个简单实用的例子:
protobuf作为一种数据表示语言,有自己的类型,如代码中写的string,int32,等等,required,optional代表这个字段是否是必填,必填写required,不必填充写optional。后面的1,2,3是序号,不是这个字段的值,必填字段是要在程序中进行填充,或者设置默认值。关于protobuf的类型和格式可以看Google Language Guide,如果想定义一个User数组进行传输,可以这样定义(注意关键字repreated):
在定义好格式之后(message文件以.proto结尾),我们可以安装protobuf的linux下的message生成工具,具体可以去Google官方下载,这是个开源项目,安装的时候还是那几步,./configure,make,make install,很简单,前提需要gcc编译器。然后安装一个protobuf的类库,这里我以python2.5为例,需要安装类库,protobuf-2.3.0-py2.5.egg,egg文件类似于c++中的.so或者是java中的jar文件,是一个库文件,提供调用,安装egg文件最简单的方法是安装easy_install,如果你不想安也可以,指定egg文件的路径,但是这样做会有些风险,因为加载egg文件还需要一个python的库setuptools-0.6c9-py2.5.egg,你可以这么干:
export PYTHONPATH=$SRC_DIR/protobuf-2.3.0-py2.5.egg:$SRC_DIR/setuptools-0.6c9-py2.5.egg
这么干的目的是把这些库文件导入python的sys.path路径中,加载的时候也能加载到,这样你在程序里直接import google.protobuf,或者导入其他protobuf的库 肯定不会报错,c++和java就不细说了,大同小异。
安装完成后,执行 protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/User.proto 如果,没提示错误的话会在输出目录下生成 XXX_pb2.py文件(我上面定义的会生成User_pb2.py),这个就是生成的类,用的时候直接引入就可以(放在一个目录下,或者导入sys.path)。
关于python调用动态链接库,python提供了一个库,ctypes,这个库2.4以及2.4之前都没有,用的时候注意版本,调用如下:
就这么简单,加一个add方法,注意User 和Users的区别,
结束语:这个东西本来是要在c++中实现的,但是涉及的东西很多,改起来相对较麻烦,而且有风险,改成用py实现了,但是c肯定要比python的序列化效率高,个人认为python更像一支粘合剂,很好用。有什么问题直接指出,望赐教。
protobuf是Google提供的一个开源序列化框架,类似于XML,JSON这样的数据表示语言,其最大的特点是基于二进制,因此比传统的XML表示高效短小得多。开发者定义类似于结构体的message,通过protobuf的工具将定义好的格式传送给protobuf的接收工具,接收工具会自动产生类,需要传输的时候直接导入这个类,将关键字段填充,通过序列化函数,将其序列化,接收端将其反序列化,实现数据传输。protobuf支持c++,java,python。详细信息见参考文档。
protobuf的格式定义,可以看文档,这里举两个简单实用的例子:
message User { required string username = 1; required string password = 2 required int32 age = 3; optional string email = 4; }
protobuf作为一种数据表示语言,有自己的类型,如代码中写的string,int32,等等,required,optional代表这个字段是否是必填,必填写required,不必填充写optional。后面的1,2,3是序号,不是这个字段的值,必填字段是要在程序中进行填充,或者设置默认值。关于protobuf的类型和格式可以看Google Language Guide,如果想定义一个User数组进行传输,可以这样定义(注意关键字repreated):
message User { required string username = 1; required string password = 2; required int32 age = 3; optional string email = 4; } message Users { repeated User user = 1; }
在定义好格式之后(message文件以.proto结尾),我们可以安装protobuf的linux下的message生成工具,具体可以去Google官方下载,这是个开源项目,安装的时候还是那几步,./configure,make,make install,很简单,前提需要gcc编译器。然后安装一个protobuf的类库,这里我以python2.5为例,需要安装类库,protobuf-2.3.0-py2.5.egg,egg文件类似于c++中的.so或者是java中的jar文件,是一个库文件,提供调用,安装egg文件最简单的方法是安装easy_install,如果你不想安也可以,指定egg文件的路径,但是这样做会有些风险,因为加载egg文件还需要一个python的库setuptools-0.6c9-py2.5.egg,你可以这么干:
export PYTHONPATH=$SRC_DIR/protobuf-2.3.0-py2.5.egg:$SRC_DIR/setuptools-0.6c9-py2.5.egg
这么干的目的是把这些库文件导入python的sys.path路径中,加载的时候也能加载到,这样你在程序里直接import google.protobuf,或者导入其他protobuf的库 肯定不会报错,c++和java就不细说了,大同小异。
安装完成后,执行 protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/User.proto 如果,没提示错误的话会在输出目录下生成 XXX_pb2.py文件(我上面定义的会生成User_pb2.py),这个就是生成的类,用的时候直接引入就可以(放在一个目录下,或者导入sys.path)。
关于python调用动态链接库,python提供了一个库,ctypes,这个库2.4以及2.4之前都没有,用的时候注意版本,调用如下:
from ctypes import * import User_pb2 libs = CDLL("./libs.so") libs.Init() user = User_pb2.User() #类似于构造方法 user.username = 'zhangpeng' user.password = 'xxxxxxxxx' user.age = 23 sContent = user.SerializeToString() #序列化方法 libs.Send(c_char_p(sContent), c_uint(len(sContent))) libs.IPCExit() 我只是粗略的写一下,大家肯定一看就明白。如果传送protobuf数组,就可以这样写:
from ctypes import * import Users_pb2 libs = CDLL("./libs.so") libs.Init() users = User_pb2.Users() #类似于构造方法 user = users.add() user.username = 'zhangpeng' user.password = 'xxxxxxxxx' user.age = 23 sContent = users.SerializeToString() #序列化方法 libs.Send(c_char_(sContent), c_uint(len(sContent))) libs.IPCExit()
就这么简单,加一个add方法,注意User 和Users的区别,
结束语:这个东西本来是要在c++中实现的,但是涉及的东西很多,改起来相对较麻烦,而且有风险,改成用py实现了,但是c肯定要比python的序列化效率高,个人认为python更像一支粘合剂,很好用。有什么问题直接指出,望赐教。
相关文章推荐
- python调用动态链接库传送protobuf数据
- python调用动态链接库传送protobuf数据
- Python调用C++动态链接库发送protobuf格式数据
- 【Python】用 Protobuf 读写数据
- Protobuf3 + Netty4: 在socket上传输多种类型的protobuf数据
- Google_Protobuf协议——Protobuf发送接收数据类型
- protobuf实现c++与java之间的数据传递,beancopy数据到前台
- Android上GTalk以及Push机制的XMPP数据选择使用protobuf格式而非XML格式
- 几种序列化协议(protobuf,xstream,jackjson,jdk,hessian)相关数据对比
- java 使用mysql 的 blob 存储 protobuf 数据 的读写操作核心代码
- python处理Protoc Buffers协议下的header+protobuf
- 几种序列化协议(protobuf,xstream,jackjson,jdk,hessian)相关数据
- 使用ajax来进行前后传送数据(django框架、Python语言)
- protobuf3 从object-c角度说明数据类型
- java调用protobuf
- Java数据通讯中使用Googgle Protobuf 序列化与反序列化
- python 3 调用c/c++ 动态链接库 *.dll
- 利用python调用elasticsearch-api来分析数据并作图进行日报邮件发送
- 利用ida python 实现复原函数调用的参数 (仅对数据被简单硬编码有效)
- C++与Python的混合编程-调用有参函数以及C++数据类型与Python数据类型间的转换