问题描述
我正在尝试使用ZeroMQ传递3张图像(存储为ndarray
)的python字典,以将其作为使用者传递给另一个程序并将数据解析回原始形式。遵循三种方式,但是任何一种方式都无法取得成功。
下面是最小复制代码示例:
import pickle
import zmq
# Adding ZMQ Context
def zmq_context():
# Creating ZMQ context starts
context = zmq.Context()
footage_socket = context.socket(zmq.PUB)
footage_socket.connect('tcp://localhost:5002')
return footage_socket
wagon_dtl,ctr1_dtl,ctr2_dtl = ndarrays of images
socket_ctx = zmq_context()
# Trying two different ways of formatting the image before creating the dict,the below approach works for all three ndarrays
# 1st way
wagon_dtl = image_np_save # image_np_save is the original image
# 2nd way (this I tried because an ndarray isn't JSON serializable)
encoded,buffer = cv2.imencode('.jpg',image_np_save)
wagon_dtl = base64.b64encode(buffer)
if cond == "fulfilled":
full_wgn_dict = {"wagon_dtl": wagon_dtl,"ctr1_dtl": ctr1_dtl,"ctr2_dtl": ctr2_dtl}
# 1st way
dict_as_b64text = base64.b64encode(full_wgn_dict)
socket_ctx.send(dict_as_b64text)
# 2nd way
myjson = json.dumps(full_wgn_dict)
socket_ctx.send(myjson)
# 3rd way
dict_as_text = pickle.dumps(full_wgn_dict).encode('base64','strict')
socket_ctx.send(dict_as_text)
如何解决这个问题?
解决方法
Q :“如何使用ZeroMQ
ndarray
发送由None
和PUB/SUB
组成的Python字典?” >
容易,最好使用现成的.send_pyobj()
方法来完成此操作。
发送方
PUB
应该对socket.send_pyobj( full_wgn_dict )
方法进行调用,基本上就在这方面。
接收方,
每个潜在的 SUB
-s都应重用.recv_pyobj()
方法。
所有SUB
-都还必须执行一个步骤,以主动订阅以接收所有消息。
有关socket.setsockopt( zmq.SUBSCRIBE,"" )
的详细信息,请参见ZeroMQ记录的API,或者不要犹豫从许多示例here中饮。
一些其他技巧(琐碎的dict
-s不需要)可能有助于SER / DES阶段的pickle
阶段。然而,这些超出了本课题的范围,可能会在受控环境中带来优势,但在开放,不受控制的环境中会带来问题,在这些环境中,您几乎没有机会满足要求的先决条件-在我的应用中,我更喜欢使用{{1} }具有更高的对象import dill as pickle
-SER / DES处理鲁棒性和许多高级功能,例如存储全会话快照。积分归@MikeMcKearns
随时重新阅读pickle.dumps()
字符串中所有与语法有关的详细信息的文档:
__doc__