互操作性问题python2python3



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

我有以下场景:

  • 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之间的兼容性?

看看"Notes";msgpack python的自述部分;

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

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

您可以使用Packer中的use_bin_type=True选项和encoding="utf-8";选项。

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

最新更新