2016-04-20 19 views
1

2つのuサービスがメッセージキュー(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'} 

のpython3にpython2と復号化にエンコーディングをやって私が手:

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

なぜデータが非「完全」に復号されます? python2とpython3の互換性を得るために、送信側/受信側で何をすべきですか?

+1

'unicode'文字列、または' str'のバイト列あなたのPython 2のコードを使用していますか? – Blckknght

+1

@Blckknght:修飾されていない文字列( '' mystring'')。私は、 '' __future__ import unicode_literals'をpython2とpython3の間で共有されているモジュールで使う必要があると思います – dangonfast

答えて

1

msgpack-pythonからREADMEの「Notes」セクションを見てください。

msgpackでは、現在のところ文字列とバイナリ形式を区別できます。しかし、それはPython 2のようではありません。Python 2はUnicode文字列を追加しました。しかし、msgpackはrawをstrに改名し、bin型を追加しました。これは、古いライブラリによって作成されたデータとの互換性を維持するためです。 rawはバイナリ以上のテキストに使用されていました。

現在、msgpack-pythonは新しいbinタイプをサポートしていますが、デフォルト設定ではそれを使用せず、rawをunicode(Python 3ではstr)の代わりにバイトとしてデコードします。

これを変更するには、Unpackerの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']