C ++和Python之间的简单IPC(跨平台)

时间:2011-08-02 16:17:16

标签: c++ python cross-platform ipc

我有一个在后台运行的C ++进程,它将生成'事件'很少需要在同一个盒子上运行的Python进程。

  • C端的代码需要尽可能轻量级。
  • Python端是只读的。
  • 实施必须是跨平台的。
  • 发送的数据非常简单。

我有什么选择?

由于

7 个答案:

答案 0 :(得分:43)

zeromq - 没有别的。将消息编码为字符串。

但是,如果要从库中获取序列化,请使用protobuf,它将为Python和C ++生成类。您在任一端使用SerializeToString()和ParseFromString()函数,然后通过ZeroMq管道字符串。

问题解决了,因为我怀疑任何其他解决方案都更快,任何其他解决方案都不会像接线那样容易理解。

如果想为rpc使用特定的系统原语,例如Windows上的命名管道和unix上的Unix域套接字,那么你应该查看Boost::ASIO。但是,除非你有(a)网络背景,并且(b)非常了解C ++,否则这将是非常耗时的

答案 1 :(得分:5)

Google的protobuf是程序之间RPC的绝佳库。它会为PythonC++生成绑定。

如果您需要分布式邮件系统,还可以使用RabbitMQzeromqActiveMQ之类的内容。有关消息队列库的讨论,请参阅this question

答案 2 :(得分:4)

使用zeromq,就像你能得到的一样简单。

答案 3 :(得分:2)

另一种选择是使用ctypes模块从Python代码调用C代码,而不是分别运行这两个程序。

答案 4 :(得分:1)

您的数据有多复杂?如果它很简单,我会将其序列化为字符串。如果它是中等复杂的我会使用JSON。 TCP是一种很好的跨平台IPC传输方式。既然你说这个IPC很少见,那么性能不是很重要,TCP + JSON也没问题。

答案 5 :(得分:0)

您可以将Google http://api.jquery.com/jquery.ajax/用于此

答案 6 :(得分:-4)

我会说你创建了一个DLL来管理两者之间的通信。 python将加载DLL并调用getData()方法,DLL将依次与进程通信并获取数据。 这应该不难。 您还可以使用XML文件或SQLite数据库或任何数据库来查询数据。守护进程将更新数据库,Python将继续查询。可能存在用于指示数据库中的数据是否已由守护程序更新然后Python将查询的字段。 当然,这取决于性能和准确度因素!