Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python C和x2B之间的通信+;和蟒蛇_Python_C++_Cross Platform_Buffer_Communication - Fatal编程技术网

Python C和x2B之间的通信+;和蟒蛇

Python C和x2B之间的通信+;和蟒蛇,python,c++,cross-platform,buffer,communication,Python,C++,Cross Platform,Buffer,Communication,我正在寻找一种在C++程序和Python脚本之间发送数据的高效而智能的方法。我有一个C++程序,它可以实时计算30Hz的坐标。我想用Python脚本访问这些坐标。我的第一个想法是简单地创建一个.txt文件并将坐标写入其中,然后让Python打开该文件并读取。但我认为这一定是一种更聪明、更高效的使用RAM而不是硬盘的方法 有人有什么好的解决办法吗?C++程序应该将3个坐标(x,y,z)写入某种缓冲区或文件,Python程序可以打开并读取它们。理想情况下,C++程序每次都会覆盖坐标,同时读取和写入文

我正在寻找一种在C++程序和Python脚本之间发送数据的高效而智能的方法。我有一个C++程序,它可以实时计算30Hz的坐标。我想用Python脚本访问这些坐标。我的第一个想法是简单地创建一个.txt文件并将坐标写入其中,然后让Python打开该文件并读取。但我认为这一定是一种更聪明、更高效的使用RAM而不是硬盘的方法

有人有什么好的解决办法吗?C++程序应该将3个坐标(x,y,z)写入某种缓冲区或文件,Python程序可以打开并读取它们。理想情况下,C++程序每次都会覆盖坐标,同时读取和写入文件/缓冲区没有问题


感谢您的帮助

您有两个基本选择:

    < L>将C++代码和Python代码作为两个单独的程序运行在两个单独的进程中,并使用 将C++代码与代码相链接,如GRC建议的。

如果你已经有了一个完整的C++复杂程序,第一个选项可能会更好。而且,它通常更容易调试和维护

对于特定的IPC机制,通常使用套接字,因为它们在操作系统级别具有某种标准化的跨平台API,如果需要在不同的机器上运行这两个程序,它们仍然可以工作。如果你使用的是现代台式机,那么套接字应该足以每秒传输三个坐标30次


如果你真的需要更多的性能,你可以查看(命名或命名)管道,但是你可能需要在C++方面额外的工作使它成为跨平台的。

< P>我认为如果Python和C++程序在同一个机器上,我们可以使用命名管道进行通信。
但是,对于不同的机器,插座是最好的选择。

您是说值将定期计算,而不是只计算一次,对吗?您是否考虑过在简单的客户机/服务器设置中使用套接字?如果您在UNIX系统上,可以使用命名管道。否则,套接字就是最好的选择。两端都是本地的套接字和命名管道有什么区别?操作系统应该对它们基本上一视同仁。@JamesKanze虽然我手头没有参考或基准,但我认为它们非常不同。即使您仅在本地地址(如
127.0.0.1
)上使用套接字绑定(侦听),操作系统仍需要完成所有与网络相关的处理:将(应用程序)有效负载包装到传输(UDP/TCP)数据包中,并将传输数据包包装到IP数据包中(不过,它可能不需要进入链路层). 即使数据包从未接触到物理接口,与操作系统简单地将其视为不透明二进制文件的管道相比,这仍然是一个巨大的开销strm@goncalopp你不应该这么做。我承认我很久没有研究过这个问题了,但至少在Sun OS(Solaris之前)下,有一种叫做Unix域套接字的东西,它的工作方式或多或少像管道,只是它跟踪记录的结束;如果内存正常,它会自动将同一台计算机上打开的套接字转换为Unix域套接字。(不是很聪明:IIRC,只有当目标是“localhost”时才会这样做,而不是如果你实际使用了机器的名称。)@JamesKanze UNIX Socket仍然存在于Linux、OS X和各种BSD中——但我从未听说过从Berkeley Socket进行自动转换(我从未使用过Sun OS)。它们在Windows上不存在,因此行为将始终依赖于平台