2016-04-20 106 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

請參閱msgpack-python自述文件的「註釋」部分;

msgpack現在可以區分字符串和二進制類型。但它不像Python 2. Python 2添加了unicode字符串。但msgpack將raw重命名爲str並添加了bin類型。這是因爲保持與舊庫創建的數據的兼容性。原始文本多於二進制文本。

目前,雖然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']