【问题标题】:"_pickle.UnpicklingError: the STRING opcode argument must be quoted" in py2 to py3 ndarray transmissionpy2 到 py3 ndarray 传输中的“_pickle.UnpicklingError:必须引用 STRING 操作码参数”
【发布时间】:2019-05-30 15:24:20
【问题描述】:

我有一个在 ROS 环境下运行 Python2 的工作站,它从机器人获取相机图像并使用标准 socket 库通过网络将其发送到 Python3 机器。我似乎无法正确解开 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 机器之间传输数据的情况,这不是我的情况。

【问题讨论】:

  • np.load 有几个参数可以处理 py2 和 3 之间的泡菜差异
  • @hpaulj np.load 处理文件,但我的数据流是相机 > 序列化 > 传输,我从不保存图像

标签: python numpy sockets pickle ros


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-02
      • 2020-01-19
      • 1970-01-01
      • 2020-10-12
      相关资源
      最近更新 更多