Простой IPC между С++ и Python (кросс-платформа) - программирование

Простой IPC между С++ и Python (кросс-платформа)

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

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

Каковы мои варианты?

Спасибо

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

Ответ 6

Я рекомендую nanomsg вместо zeromq.

И для сериализации binn над msgpack.

Ответ 7

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

Ответ 8

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