使用修改后的 python 解释器进行进程间通信

Posted

技术标签:

【中文标题】使用修改后的 python 解释器进行进程间通信【英文标题】:Interprocess communication with a modified python interpreter 【发布时间】:2018-07-27 02:57:34 【问题描述】:

TL;DR:当 stdin/stdout 不可用时,如何生成不同的 Python 解释器(从 Python 内部)并在父子之间创建通信通道?


我希望我的 python 脚本执行修改后的 python 解释器,并通过某种 IPC,例如 multiprocessing.Pipe,与 解释器运行的脚本通信。 p>

假设我有类似以下内容:

subprocess.Popen(args=["/my_modified_python_interpreter.exe",
                       "--my_additional_flag",
                       "my_python_script.py"])

它工作得很好,可以执行我的 python 脚本和所有。

我现在想用修改后的 python 解释器设置某种进程间通信

理想情况下,我想共享类似于 multiprocessing.Pipe() 的返回值之一的内容,但是我需要共享该对象与修改后的 python 进程(我怀疑 multiprocessing.Pipe即使我这样做也不会处理得很好)。

虽然发送文本和二进制文件就足够了(我不需要共享 python 对象或任何东西),但我确实需要它在所有主要操作系统(windows、Linux、Mac)上都能正常工作。

更多用例/业务说明

更具体地说,修改后的解释器是IDA 附带的IDAPython 解释器,以允许在IDA 工具中编写脚本。

不幸的是,由于 stdio 已经大量用于现有的用户界面功能(由 IDA 提供),我无法使用stdin/stdout 进行通信。


我正在寻找比我想象的更好的可能性:

    使用两个(rx 和 tx 通道)硬盘文件并将路径作为参数传递给这两个文件。 使用本地套接字并将路径作为参数传递。 在 Windows 上使用内存映射文件和 tagname,在其他操作系统上使用其他同步方法。

【问题讨论】:

除非您解释修改的确切性质并显示您正在运行的脚本,否则很难为您提供帮助。最简单的做法可能是编写一个脚本,读取您通过管道输入的标准输入并输出适当的标准输出。 @MadPhysicist 我同意 特定修改 可能会使这项任务变得更加困难,但老实说,我认为这个问题代表了不同 python 解释器的一般情况。我能否请您对缺失的信息更具体一点?请注意我提到(现在解释)stdio 对我不可用。 我没有仔细阅读。这实际上是一个很好的问题。我被这家公司对修改过的口译员吓坏了。 谢谢。我会尝试编辑它。我可以看到这如何使问题变得比必要的困难。 【参考方案1】:

在对multiprocessing.Pipe 函数和它返回的multiprocesing.Connection 对象进行了一些修改后,我意识到Connection 对象的序列化比我最初想象的要简单得多。

Connection 对象具有三个描述属性:

    fileno - 一个句柄。 Unix 上的任意文件描述符和 Windows 上的套接字。 readable - 控制是否可以读取 Connection 对象的布尔值。 writable - 控制是否可以写入 Connection 对象的布尔值。

所有三个属性都可以作为对象属性访问,并且可以通过Connection 类构造函数进行控制。

如果:

    调用Pipe 的进程生成一个子进程并共享connection.fileno() 编号。 子进程使用该文件描述符作为句柄创建一个Connection 对象。 两个解释器实现的 Connection 对象大致相同(我猜这是有风险的部分)。

Connection.sendConnection.recv 在这两个进程之间是可能的,尽管它们不共享相同的解释器构建,并且多处理模块实际上并未用于实例化子进程。

编辑:

请注意,Connection 类在 python3 中可用作 multiprocessing.connection.Connection,在 python2 中可用作 _multiprocessing.Connection(这可能表明不鼓励使用它。YMMV)

【讨论】:

只要连接只是底层系统方法的包装器,您可能不会遇到任何问题。【参考方案2】:

使用the other answer of mine 原来是一个错误。由于在 Windows 上的 python2 中如何继承句柄,我无法在 Windows 机器上获得相同的解决方案。我最终使用了在多处理模块中也能找到的更高级的Listener and Client interfaces。

This question of mine 讨论了这个错误。

【讨论】:

以上是关于使用修改后的 python 解释器进行进程间通信的主要内容,如果未能解决你的问题,请参考以下文章

Python-Cpython解释器支持的进程与线程-Day9

Python并发编程—进程间通信

Linux进程间通信——使用共享内存

进程间通信的问题(C++高手进)

Python多线程进程入门1

node进程间通信