【问题标题】:Interoperability problems python2 python3互操作性问题 python2 python3
【发布时间】:2016-04-20 06:42:22
【问题描述】:

两个 uService 通过消息队列 (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的兼容?

【问题讨论】:

  • 您的 Python 2 代码是使用 unicode 字符串还是 str 字节字符串?
  • @Blckknght:非限定字符串 ('mystring')。我想我需要在 python2 和 python3 之间共享的模块中from __future__ import unicode_literals

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


【解决方案1】:

查看msgpack-python README 的“注释”部分;

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

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

您可以通过使用 Packer 中的 use_bin_type=True 选项和 Unpacker 中的 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']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    相关资源
    最近更新 更多