python調用Google Protocol Buffer

下載地址:
http://code.google.com/p/protobuf/downloads/list

安裝命令
tar -xzf protobuf-2.5.0.tar.gz 
 cd protobuf-2.5.0 
 ./configure --prefix=$INSTALL_DIR 
python

 make  linux

 make checkapp

 make install ui

而後進入python目錄,google

python setup.py install --prefix=$INSTALL_DIRspa


寫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

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"code

相關文章
相關標籤/搜索