Простой IPC между C ++ и Python (кроссплатформенный) - PullRequest
33 голосов
/ 02 августа 2011

У меня есть процесс C ++, работающий в фоновом режиме, который будет генерировать «события» нечасто, которые нужно будет поднять процесс Python, работающий на том же компьютере.

  • Код на стороне C должен быть максимально легким.
  • Сторона Python доступна только для чтения.
  • Реализация должна быть кроссплатформенной.
  • Отправляемые данные очень просты.

Какие у меня варианты?

Спасибо

Ответы [ 7 ]

43 голосов
/ 02 августа 2011

zeromq - и ничего больше. закодировать сообщения в виде строк.

Однако, если вы хотите получить сериализацию из библиотеки, используйте protobuf , она сгенерирует классы для Python и C ++. Вы используете функции SerializeToString () и ParseFromString () на любом конце, а затем передаете строки через ZeroMq.

Проблема решена, так как я сомневаюсь, что любое другое решение быстрее, и ни одно другое решение не будет настолько простым в подключении и простым для понимания.

Если вы хотите использовать определенные системные примитивы для rpc, такие как именованные каналы в Windows и доменные сокеты Unix в unix, вам следует взглянуть на Boost :: ASIO . Однако, если у вас нет (а) опыта работы в сети и (б) очень хорошего понимания C ++, это займет очень много времени

5 голосов
/ 02 августа 2011

Google's protobuf - отличная библиотека для RPC между программами.Он генерирует привязки для Python и C ++ .

Если вам нужна распределенная система обмена сообщениями, вы также можете использовать что-то вроде RabbitMQ , zeromq или ActiveMQ .См. этот вопрос для обсуждения библиотек очереди сообщений.

4 голосов
/ 02 августа 2011

Используйте zeromq , это так просто, как вы можете получить.

2 голосов
/ 02 августа 2011

Другой вариант - просто вызвать ваш код C из кода Python, используя модуль ctypes, а не запускать две программы по отдельности.

1 голос
/ 02 августа 2011

Насколько сложны ваши данные? Если бы это было просто, я бы сериализовал его как строку. Если бы это было в меру сложным, я бы использовал JSON. TCP - хороший кроссплатформенный транспорт IPC. Поскольку вы говорите, что этот IPC встречается редко, производительность не очень важна, и с TCP + JSON все будет в порядке.

0 голосов
/ 09 сентября 2016

Вы можете использовать Google GRPC для этого

0 голосов
/ 02 августа 2011

Я скажу, что вы создаете DLL, которая будет управлять связью между ними. Питон загрузит DLL и вызовет метод, такой как getData (), а DLL в свою очередь свяжется с процессом и получит данные. Это не должно быть сложно. Также вы можете использовать XML-файл или базу данных SQLite или любую базу данных для запроса данных. Демон обновит БД, а Python продолжит запрашивать. Там может быть поле для указания того, что данные в БД уже обновлены демоном, а затем Python выполнит запрос. Конечно, это зависит от показателей производительности и точности!

...