wake-up-neo.net

Einfach IPC zwischen C++ und Python (plattformübergreifend)

Ich habe einen C++ - Prozess, der im Hintergrund ausgeführt wird und selten 'Ereignisse' generiert, die ein Python-Prozess, der auf derselben Box ausgeführt wird, benötigt.

  • Der Code auf der C-Seite muss so leicht wie möglich sein. 
  • Die Python-Seite ist schreibgeschützt.
  • Die Implementierung muss plattformübergreifend sein.
  • Die gesendeten Daten sind sehr einfach.

Welche Möglichkeiten habe ich?

Vielen Dank

32
Lee Treveil

zeromq - und sonst nichts. codieren Sie die Nachrichten als Zeichenfolgen. 

Wenn Sie die Serialisierung von Bibliotheken erhalten möchten, verwenden Sie protobuf , um Klassen für Python und C++ zu generieren. Sie verwenden die Funktionen SerializeToString () und ParseFromString () an beiden Enden und leiten dann die Zeichenfolgen über ZeroMq.

Problem gelöst, da ich bezweifle, dass jede andere Lösung schneller ist, und auch keine andere Lösung ist so einfach zu verkabeln und zu verstehen.

Wenn Sie bestimmte Systemprimitive für rpc verwenden möchten, z. B. Named Pipes unter Windows und Unix Domain Sockets unter Unix, sollten Sie unter Boost :: ASIO nachsehen. Wenn Sie jedoch (a) keinen Netzwerkhintergrund haben und (b) ein sehr gutes Verständnis von C++ haben, ist dies sehr zeitaufwändig

43
Hassan Syed

Googles protobuf ist eine großartige Bibliothek für RPC zwischen Programmen. Es erzeugt Bindungen für Python und C++ .

Wenn Sie ein verteiltes Messagingsystem benötigen, können Sie auch etwas wie RabbitMQ , zeromq oder ActiveMQ verwenden. Siehe diese Frage für eine Diskussion über die Nachrichtenwarteschlangenbibliotheken.

5
jterrace

Verwenden Sie zeromq , es ist so einfach wie Sie nur können.

4
zeekay

Eine andere Möglichkeit ist, den C-Code einfach aus dem Python-Code heraus mit dem Modul ctypes aufzurufen, anstatt die beiden Programme getrennt auszuführen.

2
mgalgs

Wie komplex sind Ihre Daten? Wenn es einfach ist, würde ich es als String serialisieren. Wenn es mäßig komplex wäre, würde ich JSON verwenden. TCP ist ein guter plattformübergreifender IPC -Transport. Da Sie sagen, dass dieses IPC selten ist, ist die Leistung nicht sehr wichtig und TCP + JSON ist in Ordnung.

1
Spike Gronim

Sie können dazu Google GRPC verwenden

0
KindDragon