Google Protocol Buffer安装及在python中的使用

安装

1. 下载protobuf源代码(当前最新版本为:2.5.0) 
#cd /opt 
#wget https://protobuf.googlecode.com/files/protobuf-2.5.0.tar.gz

2. 解压,编译,安装 
#tar zxvf protobuf-2.5.0.tar.gz 
#cd protobuf-2.5.0 
#./configure --prefix=/home/xxx/app/protobuf
#make 
#make check 
#make install

3. 继续安装protobuf的python模块(如果不用python,可跳过这一步) 
#cd ./python 
#python setup.py build 
#python setup.py test 
#python setup.py install

4.添加环境变量

export PATH=$PATH: /home/xxx/app/protobuf/bin
export PKG_CONFIG_PATH= /home/xxx/app/protobuf/lib/pkgconfig/
保存执行
source /etc/profile

5. 安装完成,验证Linux命令 
#protoc –version

6. 验证Python模块是否被正确安装 
#python 
>>>import google.protobuf 
如果没有报错,说明安装正常。

Note:

error: package directory 'google/protobuf/compiler' does not exist

解决办法:在google/protobuf/下创建compiler文件夹

再次在protobuf文件夹下运行:python setup.py install

使用

写proto文件 
package lm; 
message Person 
{ 
        required int32  id = 1; 
        required string str = 2; 
        optional int32  opt = 3; 
} 
保存为 testp.testpb.proto 

编译指令  
protoc -I=/home/workspace/testprob --python_out=/home/workspace/testprob /home/workspace/testprob/testp.testpb.proto 

其中-I是source的路径,--python_out表示对应python库的生成路径,然后是对应的proto文件。当然,pb还支持c++和java,修改--python_out即可。
google  
https://developers.google.com/protocol-buffers/docs/pythontutorial  

报错  
package directory 'google/protobuf/compiler' does not exist  

解决   
https://groups.google.com/forum/?fromgroups=#!topic/protobuf/YeT5RW4qCxY  
python ./setup.py build  
sudo python ./setup.py install  

报错  
 File "/home/workspace/testprob/testp/testpb_pb2.py", line 6, in <module>  
    from google.protobuf import reflection as _reflection  
  File "build/bdist.linux-i686/egg/google/protobuf/reflection.py", line 68, in <module>  
  File "build/bdist.linux-i686/egg/google/protobuf/internal/python_message.py"  
  ImportError: cannot import name enum_type_wrapper  

解决  
http://code.google.com/p/protobuf/issues/detail?id=438  
Log message  
Fix  issue 438 : add missing 'enum_type_wrapper' to setup.py  
是安装包的一个改进文件,copy下来, 重新安装  

根据安装目录下的demo  自己改写了个简单的, 觉得它那个还是麻烦  

write.py  
import testpb_pb4  
import sys  

p = testpb_pb2.Person()  

try:  
  f = open(sys.argv[1], "rb")  
  p.ParseFromString(f.read())  
  f.close()  
except IOError:  
  print sys.argv[1] + ": File not found.  Creating a new file."  


p.id = 32  
p.str = "test"  

f = open(sys.argv[1], "wb")  
f.write(p.SerializeToString())  
f.close()  

print "write success"  


编译指令 python write.py "test"  

read.py   
import sys  
import testpb_pb2  

if len(sys.argv) != 2:  
  print "Usage:", sys.argv[0], "ADDRESS_BOOK_FILE"  
  sys.exit(-1)  

p = testpb_pb2.Person()  

f = open(sys.argv[1], "rb")  
p.ParseFromString(f.read())  
f.close()  

print "p.str = ",  p.str  
print "p.id=", p.id  

编译指令 python read.py "test"


Protobuf定义了一套基本数据类型。几乎都可以映射到C++\Java等语言的基础数据类型.

      

protobuf 数据类型

描述

打包

C++语言映射

bool

布尔类型

1字节

bool

double

64位浮点数

N

double

float

32为浮点数

N

float

int32

32位整数、

N

int

uint32

无符号32位整数

N

unsigned int

int64

64位整数

N

__int64

uint64

64为无符号整

N

unsigned __int64

sint32

32位整数,处理负数效率更高

N

int32

sing64

64位整数 处理负数效率更高

N

__int64

fixed32

32位无符号整数

4

unsigned int32

fixed64

64位无符号整数

8

unsigned __int64

sfixed32

32位整数、能以更高的效率处理负数

4

unsigned int32

sfixed64

64为整数

8

unsigned __int64

string

只能处理 ASCII字符

N

std::string

bytes

用于处理多字节的语言字符、如中文

N

std::string

enum

可以包含一个用户自定义的枚举类型uint32

N(uint32)

enum

message

可以包含一个用户自定义的消息类型

N

object of class


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值