2017-10-10 2 views
2

I diese Fehler nur in Himbeere Pis empfangen: "TypeError: unhashable type: 'bytearray'"Nachricht aufgrund abgeschnitten "Typeerror: unhashable Typ: 'bytearray'" (in Himbeer pi)

  • Python 3.5.3
  • Raspbian Stretch 9.1
  • Die folgenden Pakete: grpcio (1.6.3) grpcio Reflexion (1.6.3) grpcio-Tools (1.6.3)

test.proto (Sehr einfach):

syntax = "proto3"; 

package bug; 

message Foo 
{ 
    string field1 = 1; 
} 

und die Python-Code:

from test_pb2 import Foo 

EXPECTED = bytearray(b'\n\x04AAAA') 
foo = Foo() 
foo.field1 = 'AAAA' 
print(foo) 

data = foo.SerializeToString() 
print(data) 
assert (data == EXPECTED) 

foo.ParseFromString(EXPECTED) 
assert (foo.field1 == 'AAAA') 

Die Deserialisierung nicht nur in Raspberry Pi (Ubuntu ist in Ordnung):

field1: "AAAA"

Traceback (most recent call last): File "/home/pi/.local/lib/python3.5/site-packages/google/protobuf/internal/python_message.py", line 1069, in MergeFromString if self._InternalParse(serialized, 0, length) != length: File "/home/pi/.local/lib/python3.5/site-packages/google/protobuf/internal/python_message.py", line 1092, in InternalParse field_decoder, field_desc = decoders_by_tag.get(tag_bytes, (None, None)) TypeError: unhashable type: 'bytearray'

During handling of the above exception, another exception occurred:

Traceback (most recent call last): File "test.py", line 13, in foo.ParseFromString(REF) File "/home/pi/.local/lib/python3.5/site-packages/google/protobuf/message.py", line 185, in ParseFromString self.MergeFromString(serialized) File "/home/pi/.local/lib/python3.5/site-packages/google/protobuf/internal/python_message.py", line 1075, in MergeFromString raise message_mod.DecodeError('Truncated message.') google.protobuf.message.DecodeError: Truncated message.

Antwort

1

ich es geschafft, das Problem zu beheben im Raspberry Pi.

Das Problem war, dass beim Ausführen in der Pi-Deserialisierung für bytearray fehlschlägt, wenn die Daten als bytes Dinge gut übergeben werden.

So ist meine aktuelle Problemumgehung so etwas wie zu tun:

foo.ParseFromString(bytes(EXPECTED)) 

Ich bin immer noch nicht sicher, warum das gleiche Problem nicht in Desktop-PC geschieht. Was ich bemerkt habe, ist, dass beim Debuggen in Desktops foo.ParseFromString als <built-in method ParseFromString of Foo object at 0x7fedcc0b3fa8> angezeigt wird, also nehme ich an, dass es eine native Optimierung in Desktops gibt, die nicht verfügbar ist, wenn sie im Pi ausgeführt wird.

Wenn ich ein wenig mehr Zeit habe, werde ich versuchen, ein wenig mehr darüber zu erforschen, wie Protobuf eingesetzt wird. Vielleicht kann jemand in der Zwischenzeit einige Details teilen.