2016-04-20 7 views
1

Zwei uServices kommunizieren über eine Nachrichtenwarteschlange (RabbitMQ). Die Daten werden unter Verwendung von message pack codiert.Interoperabilitätsprobleme python2 python3

Ich habe die folgenden Szenarien:

  • python3 -> python3: adaequat
  • python2 -> python3: Codierung gibt

Encoding erfolgt mit:

umsgpack.packb(data) 

Decodierung mit:

umsgpack.unpackb(body) 

Wenn die Codierung und Decodierung in python3 tun erhalte ich:

data={'sender': 'producer-big-red-tiger', 'json': '{"msg": "hi"}', 'servicename': 'echo', 'command': 'run'} 

Wenn Codierung auf python3 in python2 und Decodierung tun erhalte ich:

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

Warum die Daten nicht decodiert werden "vollständig" ? Was soll ich am Sender/Empfänger tun, um Kompatibilität zwischen python2 und python3 zu erreichen?

+1

Gibt es in Ihrem Python-2-Code verwenden 'unicode' Strings oder' str' Byte-Strings? – Blckknght

+1

@Blckknght: nicht qualifizierte Strings (''mystring''). Ich denke, ich muss "von __future__ import unicode_literals" in den Modulen zwischen python2 und python3 – dangonfast

Antwort

1

Schauen Sie im Abschnitt "Hinweise" der README von msgpack-python;

msgpack kann String und Binärtyp für jetzt unterscheiden. Aber es ist nicht wie Python 2. Python 2 Unicode-String hinzugefügt. Aber msgpack hat rohe in str umbenannt und den Bin-Typ hinzugefügt. Dies liegt daran, dass die Kompatibilität mit Daten beibehalten wird, die von alten Bibliotheken erstellt wurden. roh wurde für Text mehr als binär verwendet.

Während msgpack-python den neuen Bin-Typ unterstützt, verwendet die Standardeinstellung diese Funktion nicht und dekodiert raw als Byte anstelle von Unicode (str in Python 3).

Sie können dies ändern, indem Sie die Option use_bin_type = True in Packer und encoding = "utf-8" im Unpacker verwenden.

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