Простой IPC между С++ и Python (кросс-платформа)
У меня есть процесс С++, выполняющийся в фоновом режиме, который будет генерировать "события" редко, что процесс Python, запущенный в том же поле, должен будет забрать.
- Код на стороне C должен быть как можно более легким.
- Сторона Python доступна только для чтения.
- Реализация должна быть кросс-платформенной.
- Передаваемые данные очень просты.
Каковы мои варианты?
Спасибо
Ответы
Ответ 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 будет запрашивать.
Конечно, это зависит от производительности и точности факторов!