Simple IPC entre C++ et Python (plateforme croisée))

j'ai un processus C++ en cours d'exécution en arrière-plan qui générera 'des événements' rarement qu'un processus Python tournant sur la même boîte devra récupérer.

  • le code du côté C doit être aussi léger que possible.
  • le côté Python est en lecture seule.
  • La mise en œuvre doit être multi-plateforme.
  • les données envoyées sont très simples.

quelles sont mes options?

Merci

31
demandé sur Community 2011-08-02 20:17:15

7 réponses

zeromq -- et rien d'autre. encodez les messages comme des chaînes.

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

Problème résolu, car je doute que toute autre solution est plus rapide, et ni l'un ni l'autre ne sera solution être aussi facile à connecter et simple à comprendre.

si vous voulez utiliser des primitives système spécifiques pour rpc tels que les pipes nommées sur Windows et les Sockets de domaine Unix sur unix alors vous devriez regarder Boost::ASIO . Cependant, à moins que vous n'ayez (a) une expérience de réseau, et (b) une très bonne compréhension de C++, cela prendra beaucoup de temps

42
répondu Hassan Syed 2011-08-02 17:04:53

Google protobuf est une grande bibliothèque pour RPC entre les programmes. Il génère des fixations 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 cette question pour une discussion sur la file d'attente des messages bibliothèque.

5
répondu jterrace 2017-05-23 10:30:55

utilisez zeromq , c'est aussi simple que vous pouvez obtenir.

4
répondu zeekay 2011-08-02 16:38:55

une autre option consiste à simplement appeler votre code C à partir de votre code Python en utilisant le module ctypes plutôt que d'exécuter les deux programmes séparément.

2
répondu mgalgs 2011-08-02 16:49:52

Quelle est la complexité de vos données? Si c'est simple, je le sérialiserais comme une chaîne. Si c'était modérément complexe, J'utiliserais JSON. Le TCP est un bon moyen de transport multiplateformes de la CIB. Puisque vous dites que cette IPC est rare, la performance n'est pas très importante, et TCP+JSON ira bien.

1
répondu Spike Gronim 2011-08-02 16:26:19

vous pouvez utiliser Google GRPC pour ce

0
répondu KindDragon 2016-09-09 15:19:35

je dirai que vous créez une DLL qui gérera la communication entre les deux. Le python chargera DLL et la méthode call comme getData () et la DLL communiquera à son tour avec process et obtiendra les données. Qui ne devrait pas être difficile. Vous pouvez également utiliser le fichier XML ou la base de données SQLite ou n'importe quelle base de données pour interroger des données. Le démon va mettre à jour DB et Python va continuer à interroger. Il peut y avoir un fichier pour indiquer si les données dans la base de données sont déjà mises à jour par daemon et ensuite Python interrogera. Bien sûr cela dépend de la performance et des facteurs de précision!

-4
répondu Stefano Mtangoo 2011-08-02 17:16:28