"_pickle.UnpicklingError: the STRING opcode argument must be quoted" in py2 to py3 ndarray transmission

"_pickle.UnpicklingError: the STRING opcode argument must be quoted" in py2 to py3 ndarray transmission

我有一个带有 ROS 环境的工作站 运行 Python2,它从机器人获取相机图像并使用标准 [= 通过网络将其发送到 Python3 机器14=] 图书馆。我似乎无法正确解开 opencv ndarray 图像。

我能够将简单数据作为列表成功传输,但在尝试传输图像时遇到错误。

在Python2系统上,我是这样获取镜像的:

img = CvBridge().imgmsg_to_cv2(img_data, desired_encoding='bgr8')     # Convert from ROS image to OpenCV image

获取一个ndarray。 我将其序列化为:

data = pickle.dumps(img, protocol=0)

然后我发送。 回到 Python3 机器上,我尝试使用以下方法解开它:

response = pickle.loads(data_in, encoding='latin1')     # To read a Python2 dump

此时,我得到以下错误:

_pickle.UnpicklingError: the STRING opcode argument must be quoted

我发现的唯一其他解决方案解决了在 Unix 和 Windows 机器之间传输数据的情况,这不是我的情况。

关于此主题的更新,以供将来遇到相同问题的人参考。

问题并不是像我最初认为的那样是由 Py2 和 Py3 腌制字节流之间的错误转换引起的。相反,它是由错误的数据传输引起的:我在所有包裹到达之前中断了连接。 这是解决我的问题的代码块:

data_in = b''
while True:
    block = self.socket.recv(4096)
    if block:
        data_in += block

在 vscode(在 windows 10)中,您应该打开显示此错误的文件,然后将选项 CRLF 更改为 LF,然后保存文件,然后 UnpicklingError: the STRING opcode argument must be quoted error消失了。