web-dev-qa-db-fra.com

Simple IPC entre C++ et Python (multiplateforme)

J'ai un processus C++ qui s'exécute en arrière-plan et qui génère rarement des «événements» qu'un processus Python s'exécutant sur la même boîte doit être détecté.

  • Le code du côté C doit être aussi léger que possible. 
  • Le côté Python est en lecture seule.
  • L'implémentation doit être multi-plateforme.
  • Les données envoyées sont très simples.

Quelles sont mes options?

Merci

32
Lee Treveil

zeromq - et rien d'autre. encoder les messages sous forme de chaînes. 

Cependant, si vous voulez obtenir une sérialisation à partir d'une bibliothèque, utilisez protobuf , il générera des classes pour Python et C++. Vous utilisez les fonctions SerializeToString () et ParseFromString () à chaque extrémité, puis dirigez les chaînes via ZeroMq.

Le problème est résolu, car je doute qu'une autre solution soit plus rapide et aucune autre solution ne soit aussi facile à câbler et à comprendre.

Si vous voulez utiliser des primitives système spécifiques pour rpc, telles que les canaux nommés sous Windows et les sockets de domaine Unix sous unix, consultez le fichier Boost :: ASIO . Cependant, à moins que vous n’ayez (a) une expérience en réseau, et (b) une très bonne compréhension de C++, cela prendra beaucoup de temps.

43
Hassan Syed

Le protobuf de Google est une excellente bibliothèque pour le RPC entre les programmes. Il génère des liaisons pour Python et C++ .

Si vous avez besoin d’un système de messagerie distribué, vous pouvez également utiliser quelque chose comme RabbitMQ , zeromq ou ActiveMQ . Voir this question pour une discussion sur les bibliothèques de files de messages.

5
jterrace

Utilisez zeromq , c’est aussi simple que vous pouvez l’obtenir.

4
zeekay

Une autre option consiste simplement à appeler votre code C à partir de votre code Python à l'aide du module ctypes plutôt que d'exécuter les deux programmes séparément.

2
mgalgs

Quelle est la complexité de vos données? Si c'est simple, je le sérialiserais comme une chaîne. Si c'était moyennement complexe, j'utiliserais JSON. TCP est un bon transport IPC multiplate-forme. Puisque vous dites que ce IPC est rare, les performances ne sont pas très importantes et TCP + JSON ira bien.

1
Spike Gronim

Vous pouvez utiliser Google _ GRPC pour cela

0
KindDragon