2016-04-20 5 views
1

Два uServices общаются через очередь сообщений (RabbitMQ). Данные кодируются с использованием message pack.Проблемы с совместимостью python2 python3

У меня есть следующие сценарии:

  • python3 -> python3: работа тонкая
  • python2 -> python3: кодирование выдает

Кодирование осуществляется с помощью:

umsgpack.packb(data) 

Декодирование с использованием:

umsgpack.unpackb(body) 

При выполнении кодирования и декодирования в Python3 я получаю:

data={'sender': 'producer-big-red-tiger', 'json': '{"msg": "hi"}', 'servicename': 'echo', 'command': 'run'} 

При выполнении кодирования в python2 и декодирования на Python3 я получаю:

data={b'command': b'run', b'json': b'{"msg": ""}', b'servicename': b'echo', b'sender': b'bla-blah'} 

Почему данные не «полностью» декодируется ? Что мне делать с отправителем/получателем для обеспечения совместимости между python2 и python3?

+1

ли ваш Python 2 кода использование 'unicode' строк, или' str' строки байтов? – Blckknght

+1

@Blckknght: неквалифицированные строки ('' mystring''). Думаю, мне нужно «из __future__ импортировать unicode_literals» в модули, разделяемые между python2 и python3 – dangonfast

ответ

1

Посмотрите раздел «Примечания» в README от msgpack-python;

В настоящее время msgpack может различать строковый и двоичный тип. Но это не похоже на Python 2. Python 2 добавила строку unicode. Но msgpack переименовал raw в str и добавил тип bin. Это потому, что поддерживайте совместимость с данными, созданными старыми библиотеками. raw был использован для текста более двоичного.

В настоящее время, когда msgpack-python поддерживает новый тип bin, параметр по умолчанию не использует его и декодирует raw как байты вместо unicode (str в Python 3).

Вы можете изменить это, используя параметр use_bin_type = True в Packer и encoding = "utf-8" в Unpacker.

>>> import msgpack 
>>> packed = msgpack.packb([b'spam', u'egg'], use_bin_type=True) 
>>> msgpack.unpackb(packed, encoding='utf-8') 
['spam', u'egg']