«_pickle.UnpicklingError: аргумент кода операции STRING должен быть заключен в кавычки» в передаче с py2 на py3 ndarray - PullRequest
0 голосов
/ 30 мая 2019

У меня есть рабочая станция под управлением Python2 со средой ROS, которая получает изображение с камеры от робота и отправляет его по сети на компьютер Python3, используя стандартную библиотеку socket.Кажется, я не могу правильно распаковать изображение 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, что не является моим случаем.

1 Ответ

0 голосов
/ 05 июня 2019

Обновление по этой теме для возможного использования в будущем того, кто столкнется с той же проблемой.

Проблема не была вызвана, как я изначально думал, неправильным преобразованием потока протравленных байтов Py2 и Py3. Вместо этого это было вызвано неправильной передачей данных: я прерывал соединение до того, как все пакеты прибыли. Это блок кода, который решил мою проблему:

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