[英]How to import protobuf module
隨着message.proto
文件被保存在proto
文件夾中:
我將當前工作目錄更改為proto
文件夾:
cd /test/proto
然后,我運行grpc_tools.protoc
生成protobuf Python模塊:
python -m grpc_tools.protoc -I. --python_out=. message.proto
message_pb2.py
已成功生成:
script.py
位於上面的一個文件夾中,它包含:
from proto import message_pb2
message = message_pb2.Message(field_a = 'Monday')
print type(message)
運行script.py
成功加載message_pb2
模塊並聲明Message
實例:
<class 'message_pb2.Message'>
現在,我想腌制消息對象,將以下兩行添加到script.py
:
import pickle
pickled = pickle.dumps(message)
這引發了pickle.PicklingError
異常:
pickle.PicklingError: Can't pickle <class 'message_pb2.Message'>: it's not found as message_pb2.Message
我在這里使用pickle
模塊的原因是為了描述在使用multiprocessing.queue
時發生的另一個問題。 當我嘗試使用put
方法將message
放入多處理queue
時,將發生相同的PicklingError
:
from multiprocessing import Queue
queue = Queue()
queue.put(message)
結果為相同的錯誤:
PicklingError: Can't pickle <class 'message_pb2.Message'>: import of module message_pb2 failed
如何解決這個問題呢?
足夠有趣的是,如果我將生成的message_pb2
Python模塊與script.py
放在同一文件夾中,則不會發生script.py
問題:
修改后的script.py
import message_pb2
message = message_pb2.Message(field_a = 'Monday')
from multiprocessing import Queue
queue = Queue()
queue.put(message)
使用SerializeToString
方法:
queue.put(message.SerializeToString())
msg = queue.get()
print msg.field_a
我認為您沒有正確使用Protobuf。 腌制Protobuf毫無意義,因為Protos的全部意義在於它們是可序列化的。 相反,您應該按照Protobuf文檔中的說明使用SerializeToString
和ParseFromString
。
正如他們在此處指出的那樣,您將無法實際讀取這些字符串,因為它們實際上只是為了方便起見使用str
的字節序列。
編輯:進一步研究,Protobufs不能腌制,請參見此處以了解更多詳細信息: https : //groups.google.com/forum/#!topic/ protobuf/VqWJ3BmQXVg
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.