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
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
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.
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.
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!