簡體   English   中英

如何導入protobuf模塊

[英]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文檔中的說明使用SerializeToStringParseFromString

正如他們在此處指出的那樣,您將無法實際讀取這些字符串,因為它們實際上只是為了方便起見使用str的字節序列。

編輯:進一步研究,Protobufs不能腌制,請參見此處以了解更多詳細信息: https : //groups.google.com/forum/#!topic/ protobuf/VqWJ3BmQXVg

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM