Python和C++之间最基本的IPC

Posted

技术标签:

【中文标题】Python和C++之间最基本的IPC【英文标题】:The most basic IPC between Python and C++ 【发布时间】:2020-02-27 11:52:31 【问题描述】:

我正在用 C++ 编写一个 DLL(Windows,MS VS 17),它需要在某些时候调用 Python 脚本 - 它应该读取一个 json 编码的字符串,对其进行处理并返回 json 编码的结果。不需要异步模式或“光速”,但我或多或少需要快速响应 - i。 e.最多在 1-5 秒内。以下是我考虑的方法和 cmets:

    将字符串作为命令行参数传递。显然,这不是最佳选择 - 更不用说字符串长度限制了。 使用临时文件。在我的情况下最好避免这种做法,因为虽然我需要在每次启动时运行 Python 部分通常一次,但启动的次数可能会很大。 使用 TCP/IP 套接字(用于localhost)/管道。对于这样的任务来说,两者似乎都过大了——我没有不断变化的连续数据流。此外,在 Windows 中这可能会很痛苦。 使用共享内存。共享内存是一个不错的选择,但我找不到在 C++ 和 Python 中使用相同段的方法。 将 Python 部分嵌入 C++。我在这里有两个问题:a)Python env 应该安装在目标机器上,不是吗? b) python 脚本有一个import,它导入一个包,从 pip 安装,不幸的是,我无法避免它。嵌入时是否有适当的方法来处理导入?

在我的例子中,有没有一种简单的方法可以在 C++ 和 Python 之间进行互操作?

【问题讨论】:

关于共享内存 - 您可以使用命名的共享内存段并将名称传递给 Python 脚本。不确定用于共享内存的 Python API 是什么。 docs.microsoft.com/en-us/windows/win32/memory/… 【参考方案1】:

由于您的目标是 Windows,因此选项 (2) 是最好的,但请使用临时文件 CreateFile(...FILE_ATTRIBUTE_TEMPORARY)。那是有效的共享内存(在操作系统级别,两者都由虚拟内存管理器管理),但您可以获得文件语义。

【讨论】:

谢谢,MSalters!如何从 Python 访问它?仅仅通过它的标准 I/O 函数? @JamesFrezz:是的。 Python 询问操作系统,操作系统在 RAM 缓存中有文件,因为 C++ 代码告诉操作系统它是一个临时文件。所以操作系统立即给 Python 一个结果。 我检查了这种方法并注意到在当前目录中创建了一个零长度文件 - 没什么大不了的,但它有点烦人。所以我决定使用@Andrey 的建议去共享内存。以防万一,如果有人在使用共享内存时偶然发现导入错误 - 请考虑升级到 Python 3.8。 @JamesFrezz:嗯,这取决于您创建它的在哪里。毕竟,它具有文件语义,其中包括文件路径。有GetTempPath,可能会给出更合适的路径。

以上是关于Python和C++之间最基本的IPC的主要内容,如果未能解决你的问题,请参考以下文章

C++ 实现带权有向图的每对顶点之间的最短路径Floyd算法(完整代码)

这个 C++ 函数和 Python 函数之间的区别

python和c++程序之间不寻常的速度差异

使用 Redis 在 C++ 和 python 之间共享 Opencv 图像

c++ 和 python 层之间的 opencv.groupRectangles() 差异

在 C++ 和 Python 之间共享视频数据