互操作性问题python2 python3

时间:2016-04-20 06:42:23

标签: python-2.7 python-3.x rabbitmq messagepack

两个uServices正在通过消息队列(RabbitMQ)进行通信。数据使用message pack进行编码。

我有以下情况:

  • 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 个答案:

答案 0 :(得分:2)

看看" Notes"来自msgpack-python的自述文件部分;

  

msgpack现在可以区分字符串和二进制类型。但它不像Python 2. Python 2添加了unicode字符串。但是msgpack将raw重命名为str并添加了bin类型。这是因为保持与旧库创建的数据的兼容性。 raw用于文本而不是二进制文件。

     

目前,虽然msgpack-python支持新的bin类型,但默认设置并不使用它并将raw解码为字节而不是unicode(在Python 3中为str)。

     

您可以在Packer中使用use_bin_type = True选项并编码=" utf-8"解包器中的选项。

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