Serialize C ++ – Objekt zum Senden über Sockets an Python – besten Ansatz?

Ich muss eine Netzwerkkommunikation zwischen zwei verschiedenen Frameworks erstellen, eine in C++ und die andere in Python .

Um Daten auszutauschen, möchte ich irgendeine Art von flexibler Struktur (grundsätzlich eine Struktur) in C++ erstellen, die serialisiert ist, über Sockets zu Python gesendet und dann deserialisiert.

Was ist der häufigste Weg, dies zu tun? Ich bin mir sicher, dass Boost es auf beiden Seiten machen könnte, denn es gibt boost python , aber ich möchte nicht die Projektanforderungen so weit sprengen. Also gibt es vielleicht eine kleinere Bibliothek oder was auch immer eine andere elegante Lösung mit Ausnahme der Angabe eines eigenen binären Datenformats?

AKTUALISIEREN:

So ist hier ein Beispiel, wie man Googles protobuf , um eine Datenstruktur von einem C++ Skript zu einem Python Skript über UDP zu senden. Dies wird auf Mac OS X Mavericks getestet, sollte aber auch auf anderen Unix-Systemen funktionieren.

Protobuf installieren

Der erste Schritt ist natürlich die Installation der protobuf Bibliothek. Ich habe Homebrew für die Hauptbibliothek und pip , um die Python Module zu installieren:

 brew install protobuf pip install protobuf 

Dann habe ich eine sehr einfache Datenstruktur mit der Proto-Syntax definiert:

Dateiname: foo.proto

 package prototest; message Foo { required int32 id = 1; required string bar = 2; optional string baz = 3; } 

Diese Proto-Datei kann nun in C ++ und Python-Klassen übersetzt werden über:

 protoc foo.proto --cpp_out=. --python_out=. 

Der Ordner sollte nun die C ++ – Header- und Quelldateien und den Python-Code enthalten:

 ├── foo.pb.cc ├── foo.pb.h ├── foo.proto └── foo_pb2.py 

Schauen wir uns den sehr einfachen C++ Code an, der dazu gedacht ist, eine Instanz von foo über das Netzwerk zu senden, mit UDP (zu localhost auf Port 5555):

Dateiname: send.cc

 #include <sys/socket.h> #include <arpa/inet.h> // this is our proto of foo #include "foo.pb.h" int main(int argc, char **argv) { struct sockaddr_in addr; addr.sin_family = AF_INET; inet_aton("127.0.0.1", &addr.sin_addr); addr.sin_port = htons(5555); // initialise a foo and set some properties GOOGLE_PROTOBUF_VERIFY_VERSION; prototest::Foo foo; foo.set_id(4); foo.set_bar("narf"); // serialise to string, this one is obvious ; ) std::string buf; foo.SerializeToString(&buf); int sock = socket(PF_INET, SOCK_DGRAM, 0); sendto(sock, buf.data(), buf.size(), 0, (struct sockaddr *)&addr, sizeof(addr)); return 0; } 

Ich kompilierte es über clang++ :

 clang++ -o send send.cc foo.pb.cc -lprotobuf 

Und schließlich ist dies der Python Code, der auf UDP-Pakete wartet und sie in foo . Wieder: keine Fehlerprüfung überhaupt, das ist nur die Funktionalität zu demonstrieren:

Dateiname: receive.py

 import socket from foo_pb2 import Foo sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.bind(("127.0.0.1", 5555)) foo = Foo() while True: data, addr = sock.recvfrom(1024) foo.ParseFromString(data) print("Got foo with id={0} and bar={1}".format(foo.id, foo.bar)) 

Jetzt sind wir fertig und das ist die endgültige Verzeichnisstruktur:

 ├── foo.pb.cc ├── foo.pb.h ├── foo.proto ├── foo_pb2.py ├── receive.py ├── send └── send.cc 

Um das Skript zu testen, receive.py einfach an, um UDP-Pakete zu hören

 python receive.py 

Und halten Sie Ihre Augen auf die Ausgabe, wenn Sie das C ++ generierte send Skript ausführen:

 ./send 

2 Solutions collect form web for “Serialize C ++ – Objekt zum Senden über Sockets an Python – besten Ansatz?”

Gehen Sie für Protokoll-Puffer – Google Code, der genügend Ressource für c ++ und Python hat . Sie können eine kompatible Struktur erstellen, die in beiden Sprachen lesbar ist.

Protokoll-Puffer sind eine Methode zur Serialisierung von strukturierten Daten. Als solche sind sie nützlich bei der Entwicklung von Programmen, um miteinander über einen Draht zu kommunizieren oder um Daten zu speichern. Das Verfahren beinhaltet eine Schnittstellenbeschreibungssprache, die die Struktur einiger Daten beschreibt, und ein Programm, das aus diesem Beschreibungsquellcode in verschiedenen Programmiersprachen erzeugt, um einen Strom von Bytes zu erzeugen oder zu analysieren, der die strukturierten Daten repräsentiert. †

Protocol Puffers Nachfolger, Cap'n Proto , hat auch gute Unterstützung für C ++ und Python. (Disclosure: Ich bin der Autor von Cap'n Proto, und war auch der Autor der meisten der Protobuf-Code von Google veröffentlicht.)

  • Python-Gurke nicht eins zu eins: verschiedene Gurken geben das gleiche Objekt
  • Python - String zur Auflistung
  • Wie definieren wir @list_route, die Argumente akzeptieren
  • Wie man die hierarchische Beziehung in Django REST serialisiert
  • Warum funktioniert json serialisierung von datetime-Objekte in python nicht aus der Box für datetime-Objekte
  • Wie man eine MPTT-Familie serialisiert und hierarchisch hält?
  • Python menschlich lesbare Objekt Serialisierung
  • XML zu / aus einem Python-Wörterbuch
  • Serialisierung der python-Objektinstanz an JSON
  • Ist es möglich, Python-Klasse-Objekte in SQLite zu speichern?
  • Speichern von Dataframe mit Array-Einträgen
  • Python ist die beste Programmiersprache der Welt.