C++和Python之间的通信

14
我正在寻找一种高效且智能的方法,在C++程序和Python脚本之间发送数据。我有一个C++程序,以30Hz实时计算一些坐标,并希望使用Python脚本访问这些坐标。我的第一个想法是简单地创建一个.txt文件并将坐标写入其中,然后让Python打开文件并读取。但我发现最好使用内存而不是硬盘,应该有更聪明和更高效的方法。
有没有人有好的解决方案? C ++程序应将3个坐标(x,y,z)写入某种缓冲区或文件,Python程序可以打开它并读取它们。理想情况下,C ++程序每次都会覆盖坐标,并且在同时读写文件/缓冲区时不会出现问题。
感谢您的帮助。

https://docs.python.org/3.4/extending/extending.html - grc
1
你是说数值会定期计算,而不仅仅是一次性的对吧?你考虑过使用简单的客户端/服务器设置来使用套接字吗? - Andrew_CS
1
如果你在UNIX系统上,你可以使用命名管道。否则,套接字是正确的方法。 - lucasg
2个回答

15

你有两个基本选项:

  • 将C++代码和Python代码作为两个独立进程的程序分别运行,并使用IPC机制
  • 像grc建议的那样,将C++代码链接到你的代码中。

如果你已经编写了一个完整复杂的C++程序,那么第一种选择可能更好。此外,它通常更容易调试和维护。

至于特定的IPC机制,套接字通常被用作IPC机制,因为它们在操作系统级别具有标准化的跨平台API,并且如果你需要在不同的机器上运行两个程序,它们仍然可以使用。如果你处理现代桌面电脑,则套接字应该足够传输每秒三次的三个坐标。

如果你真的需要更高的性能,你可以尝试使用(命名或未命名)管道,但你可能需要在C++端做一些额外的工作来使其跨平台。


一个两端都是本地的套接字和一个命名管道有什么区别?操作系统应该基本上将它们视为相同。 - James Kanze
1
@JamesKanze 虽然我没有参考资料或基准测试,但我认为它们非常不同。即使您仅在本地地址(例如127.0.0.1)上使用套接字绑定(监听),操作系统仍需要进行所有与网络相关的处理:将(应用程序)有效负载包装到传输(UDP/TCP)数据包中,并将传输数据包包装到IP数据包中(虽然可能不需要下降到链路层)。即使数据包从未触及物理接口,与操作系统将管道视为不透明二进制流相比,这仍然是一个重要的开销。 - loopbackbee
@goncalopp 你不应该这样做。我承认我很久没有看过这个了,但至少在Sun OS(Solaris之前),有一种叫做Unix域套接字的东西,它的工作方式与管道类似,但它会跟踪记录结束符;如果我没记错的话,它会自动将在同一台机器上打开的套接字转换为Unix域套接字。(不是非常智能:如果目标是“localhost”,而不是实际使用机器的名称,它只会这样做。) - James Kanze
@JamesKanze UNIX套接字在Linux、OS X和各种BSD中仍然存在,但我从未听说过从伯克利套接字自动转换的事情(我从未使用过Sun OS)。它们在Windows上不存在,因此行为将始终依赖于平台。 - loopbackbee

2

如果进程在同一台计算机上,我认为我们可以使用命名管道来实现Python和C++程序之间的通信。

但是,如果进程在不同的计算机上,套接字是最好的选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接