如何导入protobuf模块

字母数字

随着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使用时发生的另一个问题PicklingError当我尝试使用方法进行message多重处理时,也会发生相同的情况queueput

from multiprocessing import Queue
queue = Queue()
queue.put(message)

结果为相同的错误:

PicklingError: Can't pickle <class 'message_pb2.Message'>: import of module message_pb2 failed

如何解决这个问题呢?

足够有趣的是,如果我将生成的message_pb2Python模块与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的全部要点是它们是可序列化的。相反,你应该使用SerializeToString,并ParseFromString作为注意到这里的Protobuf文档

正如他们在此处指出的那样,您将无法实际读取这些字符串,因为它们实际上只是str为了方便起见而使用的字节序列

编辑:进一步研究,Protobufs不能腌制,请参见此处以了解更多详细信息:https : //groups.google.com/forum/#!topic/ protobuf/VqWJ3BmQXVg

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

TOP 榜单

热门标签

归档